Gab*_*iel 2 c++ move copy-constructor move-semantics c++11
我有以下代码片段.有谁知道为什么在主函数中没有为所有情况调用此移动构造函数?为什么要编译呢?赋值运算符是私有的吗?链接:http://ideone.com/bZPnyY
#include <iostream>
#include <vector>
class A{
public:
A(int i){
std::cout << "Constructor "<< i <<std::endl;
for(int l = 0; l<i;l++){
vec.push_back(l);
}
};
A(A && ref): vec(std::move(ref.vec))
{
std::cout << "Move constructor"<<std::endl;
}
A & operator=(A && ref){
if(this != &ref){
vec = std::move(ref.vec);
}
std::cout << "Move assignment"<<std::endl;
return *this;
}
std::vector<int> vec;
private:
A(const A & ref);
A(A & ref);
A & operator=(A & ref);
};
A makeA(){
A a(3);
return a;
}
int main(){
A b1(makeA()) ;
A b2 = makeA();
A b3 = A(3);
A b4(A(3));
std::cout << b4.vec[2] << std::endl;
};
Run Code Online (Sandbox Code Playgroud)
输出:
构造函数3
构造函数3
构造函数3
构造函数3
2
响应的一些补充:当我添加时
std::pair<int,A> a(3,A(3));
Run Code Online (Sandbox Code Playgroud)
然后调用移动构造函数(所以希望没有NRVO)
您所看到的被称为复制省略,并记录在12.8.31中.
A makeA(){
A a(3);
return a;
}
A b1(makeA()) ;
A b2 = makeA();
Run Code Online (Sandbox Code Playgroud)
在这里,a局部变量makeA中的返回值直接布设makeA,进而临时返回值makeA是在存储直接布设b1和b2.(连续两个副本)
A b3 = A(3);
A b4(A(3));
Run Code Online (Sandbox Code Playgroud)
创建的临时A(3)构造直接在b3和中构造b4.(一份副本)
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用.在这种情况下,实现将省略的复制/移动操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象的后期时间.在没有优化的情况下销毁.122在下列情况下允许复制/移动操作(称为复制省略)的这种省略(可以合并以消除多个副本):
这是的第一部分b1和b2情况:
- 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv-非限定类型的非易失性自动对象(函数或catch子句参数除外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作
这是的第二部分b1和b2壳体,以及的整个部分b3和b4壳体:
- 当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过将临时对象直接构造到目标中来省略复制/移动操作省略的复制/移动
还有另外两个复制省略允许案例与抛出和捕获异常有关.