【问题标题】:convert std::shared_ptr<Derived> to const shared_ptr<Base>&将 std::shared_ptr<Derived> 转换为 const shared_ptr<Base>&
【发布时间】:2017-08-06 05:39:18
【问题描述】:

如果我没记错的话(根据this question),std::shared_ptr&lt;Derived&gt; 不能绑定到const std::shared_ptr&lt;Base&gt;&amp;。但是当我尝试以下代码时,它甚至没有给我任何警告。

#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&lt;B&gt; 不知道如何转换为C&lt;A&gt;(其中C&lt;A&gt; 也不知道如何从C&lt;B&gt; 构造)它们是不相关的而shared_ptr&lt;B&gt;shared_ptr&lt;A&gt; 并非无关。
  • @Pixelchemist 你能告诉我我的问题和我链接的问题之间的区别吗?我找不到我错过的地方。
  • shared_ptr 示例没有区别。我认为@KerrekSB 在这里弄错了。另一个问题很容易引起误解,因为您实际上可以shared_ptr&lt;Derived&gt; 转换为shared_ptr&lt;Base&gt; const&amp;(在我尝试过的任何最新编译器上)。
  • @Pixelchemist:是的,没错,反正评论太模棱两可了。

标签: c++


【解决方案1】:

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) 给您一个错误,因为您尚未定义执行转换的构造函数 - 不会为您隐式生成类似的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2021-11-28
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多