【问题标题】:shared_ptr<T> to const shared_ptr<const T>&shared_ptr<T> 到 const shared_ptr<const T>&
【发布时间】:2017-03-26 09:39:12
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    这里没有什么神奇的,它只是shared_ptr constructor overload (number 9)之一

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

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

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

    【讨论】:

    • "const T 必须可以从 T 隐式转换" 你是什么意思?
    • @curiousguy 我认为他的意思正是他所说的。构造函数要求Y 可以隐式转换为T。在 OP 的情况下,YTTconst T,因此它要求“T 可以隐式转换为 const T”,或者换句话说,“const T 必须可以从 T 隐式转换”。就像他说的。幸运的是,const T 总是可以从 T 转换,所以它可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2017-10-22
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多