shared_ptr<T> 转换为 const shared_ptr<const T>&

5

我对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) 是按引用传递的。但是,Func2(v1) 又是怎样的呢?

编译器会在后面做什么呢?

shared_ptr<const T> tmp_v2 = v1;
Func2(tmp_v2);

我很重视这个问题,因为Func2可能会比Func1花费更多时间(如果它确实创建了一个新的 shared_ptr 对象)。非常感谢您的帮助!
1个回答

2

这并没有什么神奇的地方,它只是 shared_ptr 构造函数的一个重载(第9个)

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

构造一个shared_ptr,它共享由r管理的对象的所有权。如果r没有管理任何对象,则此时也不会管理任何对象。如果Y不能隐式转换为(在C++17之前)兼容于(自C++17起)T*,则模板重载不参与重载决议。 为了使其有效,const T必须从T隐式转换,另一个对象不会被创建,只会被另一个shared_ptr管理。

“_const T必须可以从T隐式转换_”是什么意思? - curiousguy
@curiousguy 我认为他的意思就是他所说的。构造函数要求Y可以隐式转换为T。在OP的情况下,YT,而Tconst T,因此需要" T可以隐式转换为const T"或者换句话说," const T必须可以从T隐式转换"。就像他所说的那样。幸运的是,const T总是可以从T转换,所以它可以工作。 - Jonathan Wakely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接