Kun*_*mar 4 c++ constructor copy-constructor most-vexing-parse
说,我有一个A级
现在我在做什么
A a(A());
Run Code Online (Sandbox Code Playgroud)
究竟发生了什么?
fre*_*low 11
尽管出现,但A a(A());不是对象的定义.相反,它声明了一个函数a返回一个A,并采取了指针的函数无所取并返回A.
如果需要对象定义,则必须添加另一对括号:
A a((A()));
Run Code Online (Sandbox Code Playgroud)
如果写得正确 - A a((A()))- 编译器直接在构造函数上下文中创建临时文件以防止额外的副本.它被称为复制省略.看看这个,以及RVO和NRVO.
来自你的评论:
A a = A();
Run Code Online (Sandbox Code Playgroud)
这完全等同于
A a((A())); // note extra pair of parenthesis
Run Code Online (Sandbox Code Playgroud)
正如@Naveen正确指出的那样,A a(A());是最令人烦恼的解析,所以你需要一套额外的paranthesis来实际创建一个对象.
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |