fre*_*low 11

尽管出现,但A a(A());不是对象的定义.相反,它声明了一个函数a返回一个A,并采取了指针的函数无所取并返回A.

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

A a((A()));
Run Code Online (Sandbox Code Playgroud)


Luc*_*ore 8

如果写得正确 - 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来实际创建一个对象.

  • 它不是最令人烦恼的C++解析的例子吗?我尝试使用此代码:http://ideone.com/ZVXoT (3认同)