转换(隐式)增压共享\u ptr<;T>;至共享\u ptr<;常数T>; 我有一个C++函数,它的参数类似: void myFunction(shared_ptr<const MyObject> ptr)) { ... } void myFunction(共享){ ... }

转换(隐式)增压共享\u ptr<;T>;至共享\u ptr<;常数T>; 我有一个C++函数,它的参数类似: void myFunction(shared_ptr<const MyObject> ptr)) { ... } void myFunction(共享){ ... },c++,boost,shared-ptr,C++,Boost,Shared Ptr,在我的主代码中,我做了如下操作,它编译: shared_ptr<MyObject> test(new MyObject()); myFunction(test); shared_ptr测试(newmyobject()); 我的功能(测试); 这是否意味着在MyFunction中,如果我取消引用ptr,那么对象是常量并且不能修改 什么样的转换允许这个编译?代码编译是因为有一个shared\u ptr的构造函数接受一个shared\u ptr(如Joseph Mansfield的回答

在我的主代码中,我做了如下操作,它编译:

shared_ptr<MyObject> test(new MyObject());
myFunction(test);
shared_ptr测试(newmyobject());
我的功能(测试);
这是否意味着在MyFunction中,如果我取消引用ptr,那么对象是常量并且不能修改


什么样的转换允许这个编译?

代码编译是因为有一个
shared\u ptr
的构造函数接受一个
shared\u ptr
(如Joseph Mansfield的回答所示),因为
const MyObject
可以绑定到
MyObject
(请参阅和)。事实上,如果您试图修改
myFunction
中的
ptr
指向的值,则会出现编译错误,表明您试图修改常量对象。

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

template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
template shared_ptr(const shared_ptr&r)无例外;
定义为“不参与重载解析,除非
Y*
隐式
可转换为
T*
”。因为在您的示例中,
T*
可以隐式转换为
const T*
,所以一切都很好。当然,这很好,因为这意味着
shared\u ptr
s的行为就像原始指针一样。

当您传递
shared\u ptr
时,它将如何从原始指针构造?抱歉,它不会。我刚看到你通过了一个共享的,编辑的。