C++11 共享\u ptr<;T>;到const shared_ptr<;常数T>&; 我对SyrdypTR感到困惑,我的主要问题是: C++在我做下列操作时创建一个新对象(SyrdHypTr对象)?< /强> < /P> void Func1(const shared_ptr<T>& rhs) {} void Func2(const shared_ptr<const T>& rhs) {} shared_ptr<T> v1; Func1(v1); Func2(v1);

C++11 共享\u ptr<;T>;到const shared_ptr<;常数T>&; 我对SyrdypTR感到困惑,我的主要问题是: C++在我做下列操作时创建一个新对象(SyrdHypTr对象)?< /强> < /P> void Func1(const shared_ptr<T>& rhs) {} void Func2(const shared_ptr<const T>& rhs) {} shared_ptr<T> v1; Func1(v1); Func2(v1);,c++11,shared-ptr,implicit-conversion,pass-by-const-reference,reference-binding,C++11,Shared Ptr,Implicit Conversion,Pass By Const Reference,Reference Binding,我关心它,因为Func2可能比Func1花费更多的时间(如果它确实创建了一个新的共享\u ptr对象) 非常感谢你的帮助 这里没有什么神奇的东西,只是其中之一 模板 共享\u ptr(常数共享\u ptr&r); 9) 构造一个共享的\u ptr,它共享由r管理的对象的所有权。如果r不管理任何对象,那么它也不管理任何对象。如果Y不能隐式转换为(直到C++17)兼容(自C++17)t*,则模板重载不会参与重载解析 为了让它工作,const T必须从T隐式转换,另一个对象不会被创建,只能由另一个共

我关心它,因为
Func2
可能比
Func1
花费更多的时间(如果它确实创建了一个新的共享\u ptr对象)


非常感谢你的帮助

这里没有什么神奇的东西,只是其中之一

模板
共享\u ptr(常数共享\u ptr&r);
9) 构造一个
共享的\u ptr
,它共享由r管理的对象的所有权。如果r不管理任何对象,那么它也不管理任何对象。如果Y不能隐式转换为(直到C++17)兼容(自C++17)t*,则模板重载不会参与重载解析


为了让它工作,
const T
必须从
T
隐式转换,另一个对象不会被创建,只能由另一个
共享的

“const T必须从T隐式转换”你是什么意思?好奇的家伙,我想他说的正是这个意思。构造函数要求
Y
隐式转换为
T
。在OP的情况下,
Y
T
T
const T
,因此它要求“T隐式转换为const T”,或者换句话说,“const T必须隐式转换为T”。就像他说的。幸运的是,const T总是可以从T转换而来,所以它可以工作。
shared_ptr<const T> tmp_v2 = v1;
Func2(tmp_v2);
template< class Y >
shared_ptr( const shared_ptr<Y>& r );