我对C++中的copy-constructor感到困惑

0 c++ constructor copy-constructor

可能重复:
为什么在这种情况下不调用复制构造函数?

在下面的代码中,我构造了三个变量a1,a2和a3.

C++ Primer p.476中有一个例子:

string empty_copy = string();//copy-initialization
Run Code Online (Sandbox Code Playgroud)

有没有人可以帮我解释一下

1)为什么a1和a2不是由复制构造函数构造的

2)我的代码中的初始化a2和书中的empty_copy有什么区别?

非常感谢!

#include<iostream>
using namespace std;
class A{
public:
    A(){}
    A(int v){}
    A(const A&x){
        cout<<"copy constructor"<<endl;
    }
};
A generateA(){
    return A(0);
}
int main(){
        cout<<"First:"<<endl;
        A a1=generateA();

        cout<<"Second:"<<endl;
        A a2=A(0);

        cout<<"Third:"<<endl;
        A a3=a1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是(在Win7中的Visual Studio 2010和Ubuntu10.10中的g ++):

First:
Second:
Third:
copy constructor
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 6

由于返回值优化,这是复制省略.
允许编译器通过应用此类优化来优化副本的生成.

A a1=generateA(); 
A a2=A(0); 
Run Code Online (Sandbox Code Playgroud)

在上述两种情况下,编译器都可以消除创建临时对象的过程,该临时对象是为了保存返回值而创建的.

A a3=a1;
Run Code Online (Sandbox Code Playgroud)

涉及一个已经存在的命名对象a1,用于构造a3它涉及一个复制构造函数调用,编译器必须调用该函数并且无法进行优化.

编辑: 在评论中回答问题.

您可以通过在编译期间使用以下选项告诉编译器不应用此优化:

对于GCC:

-fno-elide-constructors
Run Code Online (Sandbox Code Playgroud)

对于MVSC:

/Od
Run Code Online (Sandbox Code Playgroud)