将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>

Posted

技术标签:

【中文标题】将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>【英文标题】:Converting (implicit) boost shared_ptr<T> to shared_ptr<const T> 【发布时间】:2014-07-13 15:07:20 【问题描述】:

我有一个 C++ 函数,它接受如下参数:

void myFunction(shared_ptr<const MyObject> ptr)) 
    ...

在我的主代码中我做了这样的事情,它编译:

shared_ptr<MyObject> test(new MyObject());
myFunction(test);

这是否意味着在 MyFunction 内部,如果我取消引用 ptr,那么对象是常量,不能修改?

进行了哪些转换以使其能够编译?

【问题讨论】:

There's a constructor 【参考方案1】:

它使用std::shared_ptr的以下构造函数:

template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;

这被定义为“不参与重载决议,除非Y* 是隐含的 可转换为T*"。因为在您的示例中,T* 可以隐式转换为const T*,所以一切都很好。这当然很好,因为这意味着shared_ptrs 的行为就像原始指针一样。

【讨论】:

【参考方案2】:

代码编译是因为shared_ptr&lt;const MyObject&gt; 的构造函数采用shared_ptr&lt;MyObject&gt;(如约瑟夫曼斯菲尔德的回答所示),因为const MyObject 可以毫无问题地绑定到MyObject(请参阅What is a converting constructor in C++ ? What is it for? 和MSDN)。事实上,如果你尝试修改myFunctionptr指向的值,那么你会得到编译错误,表明你正在尝试修改一个常量对象。

【讨论】:

当你传递 shared_ptr 时,它将如何从原始指针构造? 抱歉,不会。我刚刚看到你传递了一个 shared_ptr,已编辑。

以上是关于将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>的主要内容,如果未能解决你的问题,请参考以下文章

shared_ptr 赋值表示法隐式转换

有没有办法将 shared_ptr<void> 转换为 shared_ptr<T>?

使用相同的函数但重载不同的 std::tr1::shared_ptr<T> 和 std::shared_ptr<T>

将 generic<T> 隐式转换回 T

提升 shared_ptr 和派生类

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”