将(隐式)boost shared_ptr <t>转换为shared_ptr <const t =“”> </const> </t>

时间:2014-07-13 15:07:20

标签: c++ boost shared-ptr

我有一个C ++函数,它接受类似的参数:

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

在我的主要代码中,我做了类似的事情,然后编译:

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

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

允许编译的转换是什么?

2 个答案:

答案 0 :(得分:1)

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

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

除非隐含Y*,否则定义为“不参与重载决策” 可转换为T*“。因为,在您的示例中,T*可以隐式转换为const T*,一切都很好。当然,这很好,因为它意味着shared_ptr s就像原始指针一样。

答案 1 :(得分:0)

代码编译是因为有shared_ptr<const MyObject>的构造函数需要shared_ptr<MyObject>(在Joseph Mansfield的答案中显示),因为const MyObject可以没有问题地绑定到{{1} (见What is a converting constructor in C++ ? What is it for?MSDN)。实际上,如果您尝试修改MyObjectptr指向的值,那么您将收到编译错误,表明您正在尝试修改常量对象。