为什么复制构造函数在这种情况下不被调用

时间:2012-05-29 16:53:26

标签: c++ constructor copy-constructor most-vexing-parse

说,我有一个A级

现在我在做什么

A a(A()); 

究竟发生了什么?

2 个答案:

答案 0 :(得分:11)

尽管出现了,A a(A());不是对象定义。相反,它声明了一个名为a的函数,该函数返回A并获取一个函数指针,该函数不执行任何操作并返回A

如果需要对象定义,则必须添加另一对括号:

A a((A()));

答案 1 :(得分:8)

如果写得正确 - A a((A())) - 编译器直接在构造函数上下文中创建临时文件以防止额外的副本。它被称为 copy elision 。看看这个,以及RVO和NRVO。

来自你的评论:

A a = A();

完全等同于

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

正如@Naveen正确指出的那样,A a(A());受制于最令人烦恼的解析,因此你需要一套额外的paranthesis来实际创建一个对象。