说,我有一个A类
现在当我在做
A a(A());
到底发生了什么?
尽管有外表,但A a(A());
不是一个对象定义。相反,它声明了一个被调用的函数,该函数a
返回 anA
并接受一个指向函数的指针,该函数不接受任何内容并返回一个A
.
如果你想要一个对象定义,你必须添加另一对括号:
A a((A()));
如果编写正确 -A a((A()))
编译器直接在构造函数上下文中创建临时文件以防止额外的副本。这称为复制省略。与 RVO 和 NRVO 一起查找。
从您的评论中:
A a = A();
这完全等同于
A a((A())); // note extra pair of parenthesis
正如@Naveen 正确指出的那样,A a(A());
它受到大多数令人烦恼的解析的影响,因此您需要一组额外的括号来实际创建一个对象。