如果我没记错(根据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和许多其他在线编译器相同的结果。
我错过了什么吗?
答案 0 :(得分:4)
std::shared_ptr
有a constructor,允许从B
转换为A
:
(来自cppreference)
template< class Y > shared_ptr( const shared_ptr<Y>& r );
9)构造一个
shared_ptr
,它共享由r
管理的对象的所有权。如果r
没有管理任何对象,*this
也不会管理任何对象。如果Y*
无法隐式转换为T*
,则模板重载不会参与重载解析。
DoC(c)
给出错误,因为您尚未定义执行转换的构造函数 - 不会为您隐式生成类似的构造函数。