【发布时间】:2019-11-27 21:55:07
【问题描述】:
假设我们有以下代码
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;是否会编译。它被误导性地命名。它基本上测试值初始化,而不是默认初始化。
标签: c++ scope c++17 constexpr if-constexpr