从函数返回时向量的深层复制行为

时间:2017-09-25 09:33:30

标签: c++ c++11 visual-c++ c++14

当我从函数返回时,有人可以解释为什么向量深层复制不起作用将会很有帮助

我有一个带构造函数的结构和像这样的复制构造函数

struct  {
   A() { cout<<"Constructor..."<<endl; }
   A(const A &) { cout<<"Copy Constructor...."<<endl;
};

如果我写这样的主程序

int main() {
   A a1;  // constructor gets called here
   vector<A> vec;
   vec.push_back(a1)  // Copy constructor gets called here

   vector<A> copyvec = vec; // Again copy constructor gets called here
}

但是,如果我改变这样的代码

vector<A> retvecFunc() {
    A a1;   // Constructor gets called
    vector<A> vec;
    vec.push_back(a1); // Copy Constructor gets called

    return vec; // copy constructor **DOESN'T GETS CALLED**
}

我的主要功能是

int main() {
   vector<A> retVec = retvecFunc();
   return 0;
}

1 个答案:

答案 0 :(得分:3)

编译器实现*命名返回值优化&#34;。

vec的附加临时副本已创建。

即使存在副作用(例如在您的情况下不打印控制台消息),也允许编译器执行此操作

从C ++ 17开始,编译器必须实现这一点。