我对shared_ptr感到困惑,我的主要问题是:当我执行以下操作时,c ++是否会创建一个新对象(shared_ptr对象)?
void Func1(const shared_ptr<T>& rhs) {}
void Func2(const shared_ptr<const T>& rhs) {}
shared_ptr<T> v1;
Func1(v1);
Func2(v1);
显然,Func1(v1)
由ref传递。但是, Func2(v1)
怎么样?
编译器会做以下事情吗?
shared_ptr<const T> tmp_v2 = v1;
Func2(tmp_v2);
我关心它,因为Func2
可能比Func1
花费更多时间(如果它确实创建新的shared_ptr对象)。
非常感谢你的帮助!
答案 0 :(得分:2)
这里没有任何神奇的东西,它只是shared_ptr
constructor overload (number 9)
template< class Y >
shared_ptr( const shared_ptr<Y>& r );
9)构造一个
shared_ptr
,它共享由r管理的对象的所有权。如果r没有管理对象,那么也不会管理任何对象。如果Y 不可隐式转换为(直到C ++ 17)与(自C ++ 17)T *兼容,则模板重载不参与重载解析。
要使其发挥作用,const T
必须可以隐式转换为T
,另一个对象不会被创建,只能由另一个{{1}管理}。