Это не имеет ничего общего с if constexpr
Просто этот код не может быть скомпилирован:
class A {
public:
A(A const &) = delete;
explicit A(int);
};
A test(int a)
{
A x{a};
return x; // <-- error call to a deleted constructor `A(A const &) = delete;`
}
Изменения в C ++ 17, о которых вы думаете, должны быть сделаны с временной материализацией и не применяется к NRVO, потому что x
не является prvalue.
Например, этот код был недопустим до C ++ 17, и теперь он разрешен:
A test(int a)
{
return A{a}; // legal since C++17
}