默认构造函数的好奇心

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()};