2

我有如下代码

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 转换为非常量?谢谢。

4

1 回答 1

3

您不能移动const对象。移动意味着更改您从中移动的对象的状态(无论该对象是什么类型),并将其声明为const保证您不会更改该状态。因此,移动一个const物体是一个矛盾的术语。

尽管能够移动const对象的期望可能确实有某种理由(例如,您可能希望对象const 只要您使用它就可以,然后在完成时摆脱它并转移它的胆量而不是复制它 - 顺便说一句,a 是不可能的unique_ptr),实际上允许这样做会产生许多非常不切实际的语义后果(例如,它会允许交换两个const对象)。

因此,即使该语言在技术上确实允许从const对象移动(接受constRRef 的移动构造函数是合法的),但没有任何类型的标准库实际上为您提供这种可能性,包括unique_ptr,并且您不应该编写任何这样做的 UDT。

从概念上讲,将移动视为更改状态的操作非常重要,这与修饰符兼容。const

于 2013-01-24T23:15:40.727 回答