转换(隐式)增压共享\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
时,它将如何从原始指针构造?抱歉,它不会。我刚看到你通过了一个共享的,编辑的。