c – 为什么复制构造函数与Move Constructor一起被调用?
发布时间:2020-12-16 07:22:29 所属栏目:百科 来源:网络整理
导读:这个问题看起来很奇怪,但我已经检查了多个编译器.在我的代码中,我有一个Move Constructor和一个复制构造函数 class A { int val;public: A(int var) : val(var) { } A( A a1) { cout"M Value - "a1.valendl; cout"Move Cons..."endl; } A(const A a1) { cout
这个问题看起来很奇怪,但我已经检查了多个编译器.在我的代码中,我有一个Move Constructor和一个复制构造函数
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 -> 200 Move Cons... 这是预期的,但如果我改变我的主要功能 int main() { vector<A> v1; A a2(200); v1.push_back(A(100)); v1.push_back(move(a2)); } 我得到以下输出 M Value -> 100 Move Cons... M Value -> 200 Move Cons... Copy Cons.. // unexpected Value -> 0 // unexpected 任何人都可以帮助我理解这个拷贝构造函数的调用位置和方式..这也是值0 谢谢 解决方法
原因已在评论中得到解答.
我会试着说明发生了什么. 脚步: 矢量< A> V1; v1.push_back(A(100)); >构造和向量内移动A(100). v1.push_back(移动(A2)); >由于您尝试插入一个超过实际最大大小的新元素,因此将其重新分配到新的内存空间.请记住,std :: vector将其内容保存在连续的内存中. 记忆: 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值保持未定义. 如果将移动构造函数标记为noexcept,则将在重新分配过程中使用它而不是复制过程. 您可以使用v1.emplace_back(100)而不是v1.push_back(A(100))来避免移动. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |