Дана программа:
#include <cstdlib>
#include <memory>
bool test() {
int* ptr = (int *)malloc(sizeof(int));
bool result = ptr != nullptr;
free(ptr);
return result;
}
bool test2() noexcept {
int * ptr;
try {
ptr = new int;
}
catch (const std::bad_alloc&) {
return false;
}
bool result = ptr != nullptr;
delete ptr;
return result;
}
int main()
{
return test();
}
Clang оптимизирует обе функции до простого
{
return true;
}
См. на godbolt. GCC 6.1 этого не делает. Clang делает это даже с -O1
уровнем оптимизации.
Законно ли это с точки зрения стандарта С++?