C++ 转换std::shared\u ptr<;派生>;到const shared_ptr<;基地>&;
如果我没有记错(并且根据),则无法将C++ 转换std::shared\u ptr<;派生>;到const shared_ptr<;基地>&;,c++,C++,如果我没有记错(并且根据),则无法将std::shared_ptr绑定到const std::shared_ptr&。但是当我尝试下面的代码时,它甚至没有给我任何警告 #include <memory> struct A{}; struct B:A{}; void Do(const std::shared_ptr<A>&){} template<typename T> struct C{}; void DoC(const C<A>&am
std::shared_ptr
绑定到const std::shared_ptr&
。但是当我尝试下面的代码时,它甚至没有给我任何警告
#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
//*/
}
#包括
结构A{};
结构B:A{};
voiddo(const std::shared_ptr和许多其他在线编译器
有什么我错过了吗?std::shared\u ptr
有一个允许从B
转换到A
:
(摘自《参考文献》)
模板
共享\u ptr(常数共享\u ptr&r);
9) 构造一个shared_ptr
,它共享由r
管理的对象的所有权。如果r
不管理任何对象,*此
也不管理任何对象。如果Y*
未隐式转换为t*
,则模板重载不会参与重载解析
DoC(c)
给您一个错误,因为您没有定义一个进行转换的构造函数-不会隐式为您生成类似的构造函数。std::shared\u ptr
具有允许从B
转换到a
的构造函数:
(摘自《参考文献》)
模板
共享\u ptr(常数共享\u ptr&r);
9) 构造一个shared_ptr
,它共享由r
管理的对象的所有权。如果r
不管理任何对象,*此
也不管理任何对象。如果Y*
未隐式转换为t*
,则模板重载不会参与重载解析
DoC(c)
给你一个错误,因为你没有定义一个进行转换的构造函数-类似的构造函数不会隐式为你生成。@KerrekSB我不确定我是否理解。那么为什么DoC(c)
会给我错误?@appleapple:因为c
不知道如何转换成c
(其中c
也不知道如何从c
构造)它们是不相关的,而shared_ptr
和shared_ptr
不是不相关的。@像素化学家你能告诉我我的问题和我链接的问题之间的区别吗?我找不到我错过的地方。在共享的例子中没有区别。我想@KerrekSB把你搞错了。另一个问题是相当错误的,因为你实际上可以将shared\u ptr
转换为shared\u ptr const&
(在我尝试过的任何最新编译器上)。@Pixelchemist:是的,是的,无论如何评论都太模糊了。@KerrekSB我不确定我是否理解。那么为什么DoC(c)
会给我错误?@appleapple:因为c
不知道如何转换成c
(其中c
也不知道如何从c
构造)它们是不相关的,而shared_ptr
和shared_ptr
不是不相关的。@像素化学家你能告诉我我的问题和我链接的问题之间的区别吗?我找不到我错过的地方。在共享的例子中没有区别。我想@KerrekSB把你搞错了。另一个问题是相当错误的,因为你实际上可以将shared\u ptr
转换为shared\u ptr const&
(在我尝试过的任何最新编译器上)。@Pixelchemist:是的,是的,不管怎样,注释都太模糊了。
template< class Y >
shared_ptr( const shared_ptr<Y>& r );