默认的构造函数好奇心

Default constructor curiosity

本文关键字:好奇心 构造函数 默认      更新时间:2023-10-16

MyClass m();

是经典的陷阱,因为它没有声明变量M,而是以零参数并返回myclass的功能。但是,我发现在Visual Studio中,以下语句会产生相同的问题(似乎以某种方式与上述语句相提并论):

MyClass m( MyClass() );

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

注意:预期的内容更"明确"版本正确(即称为默认值,然后是移动构造函数)。

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

它是最烦人的解析问题。

MyClass m( MyClass() );

该行被解析,就像一个名为 m 返回的对象 myclass 的函数,并接受单个参数,该参数是一个无参数和返回值的函数指针类型 myclass

在这里:

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

std ::移动帮助编译器按预期解析行。

是的,这是经典的最烦人的解析。看起来像功能的所有内容都是函数,即使它可能是其他功能。

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

MyClass m{MyClass()};

(尽管上述示例是多余的事实,一个更好的例子是当类型不同时,例如A m{B()};