将(隐式)提升 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_ptr
s 的行为就像原始指针一样。
【讨论】:
【参考方案2】:代码编译是因为shared_ptr<const MyObject>
的构造函数采用shared_ptr<MyObject>
(如约瑟夫曼斯菲尔德的回答所示),因为const MyObject
可以毫无问题地绑定到MyObject
(请参阅What is a converting constructor in C++ ? What is it for? 和MSDN)。事实上,如果你尝试修改myFunction
中ptr
指向的值,那么你会得到编译错误,表明你正在尝试修改一个常量对象。
【讨论】:
当你传递shared_ptr
时,它将如何从原始指针构造?
抱歉,不会。我刚刚看到你传递了一个 shared_ptr,已编辑。以上是关于将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将 shared_ptr<void> 转换为 shared_ptr<T>?