虽然
MyClass m();
是一个经典的陷阱,因为它没有声明变量m,而是一个接受零参数并返回MyClass的函数。但是,我发现在Visual Studio中,以下语句产生了同样的问题(似乎它在某种程度上与上述语句相关):
MyClass m( MyClass() );
任何人都可以解释这种行为吗?
注意:更多"明确"正确的事情的版本是正确的(即调用默认值,然后是移动构造函数)。
MyClass m( std::move( MyClass() ) );
答案 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()};
)