【发布时间】:2017-08-06 05:39:18
【问题描述】:
如果我没记错的话(根据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 和许多其他在线编译器的结果相同。
我错过了什么吗?
【问题讨论】:
-
@KerrekSB 我不确定我是否理解。那为什么
DoC(c)给我错误? -
@appleapple:因为
C<B>不知道如何转换为C<A>(其中C<A>也不知道如何从C<B>构造)它们是不相关的而shared_ptr<B>和shared_ptr<A>并非无关。 -
@Pixelchemist 你能告诉我我的问题和我链接的问题之间的区别吗?我找不到我错过的地方。
-
shared_ptr示例没有区别。我认为@KerrekSB 在这里弄错了。另一个问题很容易引起误解,因为您实际上可以将shared_ptr<Derived>转换为shared_ptr<Base> const&(在我尝试过的任何最新编译器上)。 -
@Pixelchemist:是的,没错,反正评论太模棱两可了。
标签: c++