我有一个C ++函数,它接受类似的参数:
void myFunction(shared_ptr<const MyObject> ptr)) {
...
}
在我的主要代码中,我做了类似的事情,然后编译:
shared_ptr<MyObject> test(new MyObject());
myFunction(test);
这是否意味着在MyFunction中,如果我取消引用ptr,那么对象是常量并且不能被修改?
允许编译的转换是什么?
答案 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)。实际上,如果您尝试修改MyObject
中ptr
指向的值,那么您将收到编译错误,表明您正在尝试修改常量对象。