Скажем, у нас есть следующий код
struct MyClass
{
MyClass() = delete; // or MyClass() { }
MyClass(int) { }
void func() { }
};
int main()
{
if constexpr (std::is_default_constructible_v<MyClass>) {
MyClass myObj;
} else {
MyClass myObj(10);
}
myObj.func(); // Error
}
Здесь я использую if constexpr
, чтобы определить, является ли класс конструируемым по умолчанию (или нет), а затем соответствующим образом создаю объект. В некотором смысле, я наивно думал, что это упростит различные ответвления до единственного, который является истинным, т.е.
if constexpr (true) {
/* instruction branch 1 */
} else if constexpr (false) {
/* instruction branch 2 */
}
просто становится
/* instruction branch 1 */
Но на самом деле, наверное, это больше похоже на это
{
/* instruction branch 1 */
}
Но тогда возникает вопрос (возвращаясь к самому первому примеру), как я могу сохранить myObj
в области видимости за пределами { ... }
?
std::is_default_constructible_v
не проверяет, будет ли компилироватьсяMyClass myObj;
. Оно ошибочно названо. Он в основном проверяет инициализацию значения, а не инициализацию по умолчанию. - person Brian Bi   schedule 19.07.2019