我有以下代码片段。有谁知道为什么在主函数中没有在所有情况下都调用此move构造函数?为什么仍然可以编译?分配运算符是私有的?此处的链接: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;
};
输出:
构造函数3
构造函数3
构造函数3
构造函数3
2
响应中的一些补充:当我添加时
std::pair<int,A> a(3,A(3));
然后调用move构造函数(因此,希望没有NRVO)
您所看到的称为复制省略,并记录在12.8.31中。
A makeA(){
A a(3);
return a;
}
A b1(makeA()) ;
A b2 = makeA();
在这里,a
在局部变量makeA
中的返回值直接布设makeA
,并在转的临时返回值makeA
是在存储直接布设b1
和b2
。(连续两个副本省略)
A b3 = A(3);
A b4(A(3));
使用创建的临时对象A(3)
直接在b3
和中构造b4
。(一个副本省略)
当满足某些条件时,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用,也允许实现忽略类对象的复制/移动构造。在这种情况下,实现将忽略的复制/移动操作的源和目标视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象本来应该以较晚的时间发生。122在以下情况下允许复制/移动操作的这种省略,称为复制删除,(可以合并以消除多个副本):
这是b1
andb2
案例的第一部分:
- 在具有类返回类型的函数的return语句中,当表达式是具有与函数返回类型相同的cv非限定类型的非易失性自动对象(函数或catch子句参数除外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作
这是的第二部分b1
和b2
壳体,以及的整个部分b3
和b4
壳体:
- 当尚未绑定到引用(12.2)的临时类对象将被复制/移动到具有相同cv-unqualtype类型的类对象时,可以通过将临时对象直接构造到目标中来省略复制/移动操作省略的副本/移动的
还有两个其他允许复制省略的情况与抛出和捕获异常有关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句