shared_ptr <t>到const shared_ptr <const t =“”>&amp;

时间:2017-03-26 09:39:13

标签: c++11 shared-ptr implicit-conversion pass-by-const-reference reference-binding

我对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对象)。

非常感谢你的帮助!

1 个答案:

答案 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}管理}。