C++;11不同的构造(大括号) 我对C++是很新的,并且观察到,下面的代码行有不同的动作 MyClass c1; c1.do_work() //works MyClass c2(); c2.do_work() //compiler error c2228: left side is not a class, structure, or union. MyClass c3{}; c3.do_work() //works

C++;11不同的构造(大括号) 我对C++是很新的,并且观察到,下面的代码行有不同的动作 MyClass c1; c1.do_work() //works MyClass c2(); c2.do_work() //compiler error c2228: left side is not a class, structure, or union. MyClass c3{}; c3.do_work() //works,c++,c++11,constructor,most-vexing-parse,C++,C++11,Constructor,Most Vexing Parse,将头文件作为 class MyClass { public: MyClass(); void do_work(); }; 你能给我解释一下,这三种创造物体的方式有什么不同吗?为什么第二种方法会产生编译器错误?方法一和三调用默认构造函数 MyClass c3{}; 是一种新的初始化语法,名为。这称为默认大括号初始化。然而: MyClass c2(); 声明一个函数c2,该函数不接受返回类型为MyClass的参数(第二个版本) MyClass c2(); 是函数声明-请参阅和

将头文件作为

class MyClass {
public:
    MyClass();
    void do_work();
};

你能给我解释一下,这三种创造物体的方式有什么不同吗?为什么第二种方法会产生编译器错误?

方法一和三调用默认构造函数

MyClass c3{};
是一种新的初始化语法,名为。这称为默认大括号初始化。然而:

MyClass c2();
声明一个函数
c2
,该函数不接受返回类型为
MyClass

的参数(第二个版本)

MyClass c2();
是函数声明-请参阅和

第一种情况是默认初始化


最后一个案例是C++11中新增的,如果有默认构造函数,它将调用默认构造函数,因为即使它看起来像一个初始化列表,它也是空的。

相关:其中两个:。至于第三个问题,查找最令人烦恼的解析,你无疑会找到它。这个问题的答案有帮助吗:我从来没有听说过最令人烦恼的解析。。。非常感谢。对于大括号初始化,可以在这里找到一些解释和示例:要更详细地解释为什么它被解释为函数,请查看.Declaration,而不是definition:-)发生在我们所有人身上!;-)(+1)