unique_ptr与move的不同行为?

时间:2013-01-24 22:58:11

标签: c++ move unique-ptr

我的代码如下

std::vector<std::unique_ptr<int>> v;
std::unique_ptr<int> a(new int(0));
std::unique_ptr<int>& b = a;
v.insert(v.begin(), std::move(b)); //ok

但是如果我在第三个语句中添加const

const std::unique_ptr<int>& b = a;
v.insert(v.begin(), std::move(b)); //Compiler error, cannot access ptr private member

为什么编译器显示它不能访问唯一指针的私有成员,除了不能将const转换为非const?感谢。

1 个答案:

答案 0 :(得分:3)

您无法移动const对象。移动意味着改变您移动的对象的状态(对象所属的任何类型),并将其声明为const,以保证您不会改变该状态。因此,移动const对象是一个矛盾。

虽然能够移动const对象的期望可能确实有某种理由(例如,只要您使用它,您可能希望对象为const ,然后在你完成之后摆脱它并传输它的胆量而不是复制它 - 这对于unique_ptr来说是不可能的,实际上允许它会有一些非常不切实际的语义后果(例如,它允许交换两个const个对象。

因此,即使该语言在技术上允许从const对象移动(移动构造函数接受const RRef legal ),实际上没有任何类型的标准库给你这种可能性,包括unique_ptr,你不应该写任何UDT。

从概念上讲,考虑移动为状态改变操作非常重要, const修饰符不兼容。