C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么复制构造函数与Move Constructor一起被调用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_1@ @H_673_1@
这个问题看起来很奇怪,但我已经检查了多个编译器.在我的代码中,我有@L_61_3@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));              
}

输出

@H_511_6@m Value -> 200 Move Cons...

这是预期的,但如果我改变我的主要功能

int main()
{
    vector<A> v1;
    A a2(200);
    v1.push_BACk(A(100));
    v1.push_BACk(move(a2));

}

我得到以下输出

@H_511_6@m Value -> 100 Move Cons... M Value -> 200 Move Cons... Copy Cons.. // unexpected Value -> 0 // unexpected

任何人都可以帮助我理解这个拷贝构造函数调用位置和方式..这也是值0

谢谢

@H_673_1@

解决方法@H_197_34@
原因已在评论中得到解答.
我会试着说明发生了什么.

脚步:

矢量< 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))来避免移动.

@H_673_1@ @H_673_1@
@H_673_1@
@H_673_1@

大佬总结

以上是大佬教程为你收集整理的c – 为什么复制构造函数与Move Constructor一起被调用?全部内容,希望文章能够帮你解决c – 为什么复制构造函数与Move Constructor一起被调用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。