
class A { int val;public: A(int var) : val(var) { } A( A && a1) { cout<<"M Value -> "<<a1.val<<endl; cout<<"Move Cons..."<<endl; } A(const A & a1) { cout<<"copy Cons.."<<endl; cout<<"Value -> "<<a1.val<<endl; }}; 如果我把我的主要功能写成
int main(){ vector<A> v1; A a2(200); v1.push_back(move(a2)); } 输出是
M Value -> 200Move Cons...
这是预期的,但如果我改变我的主要功能
int main(){ vector<A> v1; A a2(200); v1.push_back(A(100)); v1.push_back(move(a2));} 我得到以下输出
M Value -> 100Move Cons...M Value -> 200Move Cons...copy Cons.. // unexpectedValue -> 0 // unexpected
任何人都可以帮助我理解这个拷贝构造函数的调用位置和方式..这也是值0
谢谢
解决方法 原因已在评论中得到解答.我会试着说明发生了什么.
脚步:
矢量< A> V1;
>矢量的分配.它内部为一个元素保留空间.
v1.push_back(A(100));
>构造和向量内移动A(100).
v1.push_back(移动(A2));
>由于您尝试插入一个超过实际最大大小的新元素,因此将其重新分配到新的内存空间.请记住,std :: vector将其内容保存在连续的内存中.
>在v1内移动a2.
>将原始v1的其余元素(在本例中仅为第一个)复制到新v1.
记忆:
1) ## v1[undef ] #########################2) ## v1[A(100)] #########################3) ## [A(100)] ### v1[undef,undef ] ##4) ## [A(100)] ### v1[undef,A(200)] ##5) ## [A(100)] ### v1[A(100),A(200)] ##
补充说明:
与值0相关,这是因为这些复制和移动构造函数实际上什么都不做,并且val值保持未定义.
使用适当的构造函数,此日志应为100.
如果将移动构造函数标记为noexcept,则将在重新分配过程中使用它而不是复制过程.
您可以使用v1.emplace_back(100)而不是v1.push_back(A(100))来避免移动.
总结以上是内存溢出为你收集整理的c – 为什么复制构造函数与Move Constructor一起被调用?全部内容,希望文章能够帮你解决c – 为什么复制构造函数与Move Constructor一起被调用?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)