默认构造函数的好奇心

时间:2016-12-06 19:44:36

标签: c++ visual-studio c++11 most-vexing-parse

虽然

MyClass m();

是一个经典的陷阱,因为它没有声明变量m,而是一个接受零参数并返回MyClass的函数。但是,我发现在Visual Studio中,以下语句产生了同样的问题(似乎它在某种程度上与上述语句相关):

MyClass m( MyClass() );

任何人都可以解释这种行为吗?

注意:更多"明确"正确的事情的版本是正确的(即调用默认值,然后是移动构造函数)。

MyClass m( std::move( MyClass() ) );

2 个答案:

答案 0 :(得分:4)

Most Vexing Parse 问题。

MyClass m( MyClass() );

此行被解析为名为 m 的函数,返回类型为 MyClass 的对象,并接受单个参数,该参数是指向没有参数的函数的指针,返回值为输入 MyClass

下面:

MyClass m( std::move( MyClass() ) );

std :: move 可帮助编译器按预期解析该行。

答案 1 :(得分:3)

是的,这是一个经典的最令人烦恼的解析。看起来像函数的所有东西都是函数,即使它可能是其他东西。

有几种遗留方法可以将其转换为适当的变量定义,但最好的方法是使用统一初始化:

MyClass m{MyClass()};

(尽管上面的例子是多余的,更好的例子是当类型不同时,例如A m{B()};