4

说,我有一个A类

现在当我在做

A a(A()); 

到底发生了什么?

4

2 回答 2

11

尽管有外表,但A a(A());不是一个对象定义。相反,它声明了一个被调用的函数,该函数a返回 anA并接受一个指向函数的指针,该函数不接受任何内容并返回一个A.

如果你想要一个对象定义,你必须添加另一对括号:

A a((A()));
于 2012-05-29T16:58:45.533 回答
8

如果编写正确 -A a((A()))编译器直接在构造函数上下文中创建临时文件以防止额外的副本。这称为复制省略。与 RVO 和 NRVO 一起查找。

从您的评论中:

A a = A();

完全等同于

A a((A())); // note extra pair of parenthesis 

正如@Naveen 正确指出的那样,A a(A());它受到大多数令人烦恼的解析的影响,因此您需要一组额外的括号来实际创建一个对象。

于 2012-05-29T16:56:02.813 回答