将std :: shared_ptr <derived>转换为const shared_ptr <base />&amp;

时间:2017-03-15 12:58:57

标签: c++

如果我没记错(根据this question),std::shared_ptr<Derived>无法绑定到const std::shared_ptr<Base>&。但是,当我尝试以下代码时,它甚至没有给我任何警告。

#include <memory>
struct A{};
struct B:A{};

void Do(const std::shared_ptr<A>&){}

template<typename T>
struct C{};
void DoC(const C<A>&){}

int main()
{
    std::shared_ptr<B> b = std::make_shared<B>();
    Do(b); //accept ?
    /*following lines generate error
    C<B> c;
    DoC(c); //error
    //*/
}

编译器为mingw g++ 5.3.0,标记为-std=c++14 -Wall -Wextra -pedantic -Werror

Coliru和许多其他在线编译器相同的结果。

我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

std::shared_ptra constructor,允许从B转换为A

  

(来自cppreference)

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

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

DoC(c)给出错误,因为您尚未定义执行转换的构造函数 - 不会为您隐式生成类似的构造函数。