c ++ 11为什么这个移动构造函数不工作? [英] c++11 Why doesn't this move constructor work?

查看:231
本文介绍了c ++ 11为什么这个移动构造函数不工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了下面的代码。我希望在 LargeClass 的实例之间移动向量的内容。移动构造函数正在使用,但不是移动我只获得副本。



为什么移动语义在这里不起作用?



代码:

  #include< iostream& 
#include< vector>

class LargeClass
{
public:
explicit LargeClass(void):numbers(20,10)
{
}
LargeClass(const LargeClass& rhs):numbers(rhs.numbers)
{
std :: cout< Using LargeClass copy constructor<< '\\\
';
}
LargeClass(const LargeClass&& rhs):numbers(std :: move(rhs.numbers))
{
std :: cout< Using LargeClass move constructor<< '\\\
';
}

const int * getNumbersAddress(void)const
{
return(numbers.data());
}

private:
std :: vector< int>数字;
};

int main()
{
LargeClass l1;
std :: cout<< l1 vector address:<< l1.getNumbersAddress()<< '\\\
';

LargeClass l2(l1);
std :: cout<< l1 vector address:<< l1.getNumbersAddress()<< '\\\
';
std :: cout<< l2 vector address:<< l2.getNumbersAddress()<< '\\\
';

LargeClass l3 = std :: move(l2);
std :: cout<< l1 vector address:<< l1.getNumbersAddress()<< '\\\
';
std :: cout<< l2 vector address:<< l2.getNumbersAddress()<< '\\\
';
std :: cout<< l3 vector address:<< l3.getNumbersAddress()<< '\\\
';

return 0;
}

可能的输出:

  l1向量地址:0x18ce010 
使用LargeClass复制构造函数
l1向量地址:0x18ce010
l2向量地址:0x18ce070
使用LargeClass移动构造函数
l1矢量地址:0x18ce010
l2矢量地址:0x18ce070
l3矢量地址:0x18ce0d0


解决方案

右值引用在它们的 const 表单中没有意义,因为你想修改它们到移动)。在C ++中创建为 const 的对象在只读存储器中,从中无法获取/修改内部资源。



移动构造函数的语法 通常应为



查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆