为什么std :: unique_ptr没有const get方法?

qui*_*tle 7 c++ const smart-pointers c++11

我明白这std::unique_ptr是它的方式,可能不会改变以打破向后兼容性,但我想知道是否有人有充分的理由为什么规范的编写者没有get使用看起来像const变量的方法重载方法

const T* get() const;
Run Code Online (Sandbox Code Playgroud)

跟随的意图unique_ptr存在const.

我最好的猜测是它试图镜像指针,T* const而不是典型的类.作为一个后续问题,如果我想在我的类的const实例中以类似const的方式持有一个指针,我应该使用除了std::unique_ptr保存数据之外的其他东西吗?

更新

在我的情况下,我想保护自己免于滥用类本身的指针.我正在编写一个const移动构造函数MyClass(const MyClass&& other),并将数据从新实例复制到其他via std::copy.我花了很长时间来追踪这个bug,因为我认为副本必须是正确的,因为const保护.我试图找出我可以做些什么来保护自己,除了提供一个const getter并在进行复制时在类中使用它.

Mar*_*k R 6

智能指针伪装成原始指针。如果您有原始指针的类成员并在const无法更新指针的方法中使用它,但您可以修改指向的对象。智能指针需要相同的行为。方法std::unique_ptr::get也是如此const,但不强制返回指向const对象的指针。

另请注意,您可以拥有指向const对象的指针。

MyClass *pointerToObject
std::unique_ptr<MyClass> smartPointerToObject;

// but you can have also a case
const MyClass *pointerToConstObject
std::unique_ptr<const MyClass> smartPointerToConstObject;
Run Code Online (Sandbox Code Playgroud)

在最后一种情况下,std::unique_ptr::get将返回您期望的内容。


基于以下评论:

只需提供私有方法:

InnerClass& GetField() { return *uniquePtrToInnerClass; }
const InnerClass& GetField() const { return *uniquePtrToInnerClass; }
Run Code Online (Sandbox Code Playgroud)

并在您的代码中使用它,您将在 const 方法中拥有内部类的 const 对象。


Ben*_*igt 5

没有必要通过它对对象进行只读访问unique_ptr.您只unique_ptr在转移所有权时传递,为了访问没有所有权转移的对象,调用up.get()并传递const T*给应该只读取的函数(或者如果指针从不nullptr,则评估*(up.get())并传递a 也是合理的const T&).

作为奖励,这允许您将该函数与存储在堆栈中的对象一起使用,嵌入到另一个对象中,或者使用除了之外的智能指针进行管理unique_ptr.

这里对所有unique_ptr参数传递案例(in/out,const/non-const等)进行了很好的讨论:


Yak*_*ont 5

出于相同的原因T*const,取消引用时a是a T&,而不是a T const&

的常量性指针是从pointness不同指向的

get是常量,它不会改变状态unique_ptr

它的恒定性不影响内容的恒定性。

智能指针的想法促进了一致性,但unique_ptr并非如此。

std::experimental::propogate_const包装类似指针的对象,并使其const通过。

它或类似的东西可能会解决您的问题。

请注意,当我尝试像这样进行const传播时,发现我有一半的时间发现自己错了。但这可能不是这种情况。

一般情况下,处理的胆量的正确方法T*constconst方式是通过一个T const&(或可空变体T const*)。

  • `std :: experimental :: propagate_const &lt;std :: unique_ptr &lt;T &gt;&gt;`? (2认同)
  • @quittle 这个“深层常量”不应该是“无处不在的东西”?您可以在任何情况下编写别名 - `template&lt;class T&gt; using flat_ptr = std::experimental::propotate_const&lt;std::unique_ptr&lt;T&gt;&gt;`。该类仅在包含逻辑 const 指针的类中使用才有意义;`unique_ptr` 的其他用途不应使用它。 (2认同)