我的代码如下
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?感谢。
答案 0 :(得分:3)
您无法移动const
对象。移动意味着改变您移动的对象的状态(对象所属的任何类型),并将其声明为const
,以保证您不会改变该状态。因此,移动const
对象是一个矛盾。
虽然能够移动const
对象的期望可能确实有某种理由(例如,只要您使用它,您可能希望对象为const
,然后在你完成之后摆脱它并传输它的胆量而不是复制它 - 这对于unique_ptr
来说是不可能的,实际上允许它会有一些非常不切实际的语义后果(例如,它允许交换两个const
个对象。
因此,即使该语言在技术上允许从const
对象移动(移动构造函数接受const
RRef legal ),实际上没有任何类型的标准库给你这种可能性,包括unique_ptr
,你不应该写任何UDT。
从概念上讲,考虑移动为状态改变操作非常重要, 与const
修饰符不兼容。