说,我有一个A级
现在我在做什么
A a(A());
究竟发生了什么?
答案 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来实际创建一个对象。