假设我们有以下代码
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
范围保持在{ ... }
?