是否存在从std :: shared_ptr <t>到std :: shared_ptr <const t =“”>的隐式转换?

时间:2015-07-24 14:47:55

标签: c++ type-conversion shared-ptr

假设我声明了一个接受std::shared_ptr<const T>参数的函数:

void func(std::shared_ptr<const T> ptr);

此功能是否会接受传递std::shared_ptr<T>的呼叫?

2 个答案:

答案 0 :(得分:2)

如果查看std::shared_ptr的构造函数,其中两个是:

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

template< class Y > 
shared_ptr( shared_ptr<Y>&& r );       // (10)

其中

  

9)构造一个shared_ptr,它共享由r管理的对象的所有权。如果r没有管理任何对象,*this也不会管理任何对象。如果Y*无法隐式转换为T*,则此超载不会参与重载解析。

     

10)从shared_ptr移动构建r。构建完成后,*this包含以前状态r的副本,r为空。如果Y*无法隐式转换为T*,则此超载不会参与重载解析。

这些构造函数不是explicit,而T*肯定可以隐式转换为const T*,这只是一种资格转换。所以,是的,该功能将接受它。 Simple Demo

答案 1 :(得分:2)

您可以传递shared_ptr,但是您只能调用const方法:

void foo(std::shared_ptr<const A> val)
{
    val->ConstMethod();
    val->Method();      // Denied
}

//....
std::shared_ptr<A> a(new A());

foo(a);