默认构造函数的好奇心
Default constructor curiosity
同时
MyClass m();
是一个典型的陷阱,因为它没有声明变量 m,而是声明一个采用零参数并返回 MyClass 的函数。但是,我发现在 Visual Studio 中,以下语句会产生相同的问题(似乎它以某种方式崩溃为上述语句):
MyClass m( MyClass() );
谁能解释这种行为?
注意:比预期更 "explicit" 的版本会做正确的事情(即调用默认值,然后调用移动构造函数)。
MyClass m( std::move( MyClass() ) );
这是最令人烦恼的解析问题。
MyClass m( MyClass() );
这一行被解析为一个名为 m returning 类型 MyClass 的对象并接受一个参数的函数是一个指向没有参数和 return 类型 MyClass.
值的函数的指针
这里:
MyClass m( std::move( MyClass() ) );
std::move 帮助编译器按预期解析该行。
是的,这是经典的Most Vexing Parse。任何看起来像函数的东西都是函数,即使它可能是其他东西。
有几种遗留方法可以将其转换为适当的变量定义,但最好的方法是使用统一初始化:
MyClass m{MyClass()};
(尽管上面的例子是多余的,更好的例子是类型不同的时候,比如A m{B()};
)
同时
MyClass m();
是一个典型的陷阱,因为它没有声明变量 m,而是声明一个采用零参数并返回 MyClass 的函数。但是,我发现在 Visual Studio 中,以下语句会产生相同的问题(似乎它以某种方式崩溃为上述语句):
MyClass m( MyClass() );
谁能解释这种行为?
注意:比预期更 "explicit" 的版本会做正确的事情(即调用默认值,然后调用移动构造函数)。
MyClass m( std::move( MyClass() ) );
这是最令人烦恼的解析问题。
MyClass m( MyClass() );
这一行被解析为一个名为 m returning 类型 MyClass 的对象并接受一个参数的函数是一个指向没有参数和 return 类型 MyClass.
值的函数的指针这里:
MyClass m( std::move( MyClass() ) );
std::move 帮助编译器按预期解析该行。
是的,这是经典的Most Vexing Parse。任何看起来像函数的东西都是函数,即使它可能是其他东西。
有几种遗留方法可以将其转换为适当的变量定义,但最好的方法是使用统一初始化:
MyClass m{MyClass()};
(尽管上面的例子是多余的,更好的例子是类型不同的时候,比如A m{B()};
)