4

我对 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.

非常感谢您的帮助!

4

1 回答 1

2

这里没有什么神奇之处,它只是shared_ptr构造函数重载之一(编号 9)

template< class Y >
shared_ptr( const shared_ptr<Y>& r );

9) 构造一个shared_ptr共享由 r 管理的对象的所有权的 a。如果 r 不管理任何对象,则 this 也不管理任何对象。如果 Y不能隐式转换为(C++17 前)与(C++17 起)T* 兼容,则模板重载不参与重载决议。

为了使其工作,const T必须隐式转换 from ,不会创建T另一个对象,只能由另一个对象管理。shared_ptr

于 2017-03-26T09:52:36.307 回答