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并在进行复制时在类中使用它.
智能指针伪装成原始指针。如果您有原始指针的类成员并在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 对象。
没有必要通过它对对象进行只读访问unique_ptr.您只unique_ptr在转移所有权时传递,为了访问没有所有权转移的对象,调用up.get()并传递const T*给应该只读取的函数(或者如果指针从不nullptr,则评估*(up.get())并传递a 也是合理的const T&).
作为奖励,这允许您将该函数与存储在堆栈中的对象一起使用,嵌入到另一个对象中,或者使用除了之外的智能指针进行管理unique_ptr.
这里对所有unique_ptr参数传递案例(in/out,const/non-const等)进行了很好的讨论:
出于相同的原因T*const,取消引用时a是a T&,而不是a T const&。
的常量性指针是从pointness不同指向的。
get是常量,它不会改变状态的unique_ptr。
它的恒定性不影响内容的恒定性。
智能指针的想法促进了一致性,但unique_ptr并非如此。
std::experimental::propogate_const包装类似指针的对象,并使其const通过。
它或类似的东西可能会解决您的问题。
请注意,当我尝试像这样进行const传播时,发现我有一半的时间发现自己错了。但这可能不是这种情况。
一般情况下,处理的胆量的正确方法T*const的const方式是通过一个T const&(或可空变体T const*)。
| 归档时间: |
|
| 查看次数: |
2399 次 |
| 最近记录: |