【问题标题】:is assigning unique_ptr to shared_ptr allowed? [duplicate]是否允许将 unique_ptr 分配给 shared_ptr? [复制]
【发布时间】:2018-08-16 10:40:17
【问题描述】:
std::map<std::string, std::shared_ptr<SomeClass>> map_string_to_object_pointer;


map_string_to_object_pointer["abcd"] = std::make_unique<SomeClass>();

问题是关于将 unique_ptr 分配给 shared_ptr。这是一个现有的代码,因此只是试图了解它是否是一个糟糕的编程或将唯一分配给 shared_ptr 隐式地将 unique_ptr 转换为共享?因此没有编译器警告。

【问题讨论】:

  • 为什么不应该?它甚至比分配常规指针更安全,尽管在这种情况下使用make_unique 而不是make_shared 没有意义。
  • @lubgr 感谢您对副本的引用。这正是我想要的。

标签: c++


【解决方案1】:

是的,这会调用相应的赋值运算符:

 template< class Y, class Deleter > 
 shared_ptr& operator=( std::unique_ptr<Y,Deleter>&& r );

【讨论】:

  • 我唯一要补充的是,您需要将 unique_ptr 移动到 shared_ptr 中 - 正如构造函数的右值引用签名所表示的那样。它在原始发布的代码中起作用的原因是对 make_unique 的调用是一个右值
【解决方案2】:

constructorassignment 都存在这种过载(即使 std::auto_ptr 被接受为 0_o。)

确实只有一种不好的编程习惯:在不知道自己在做什么的情况下做某事。其他都可以接受。

【讨论】:

  • 我认为这个答案中的随机评论并没有增加任何内容。恰恰相反。
  • @MaxLanghof 打扰一下?
  • 我让你知道我发现第二段既不同意也不与这个问题相关。
  • 究竟如何?问题是“这是否是一个糟糕的编程”,我试图给出最详细的答案。
  • 当标题明确询问“允许”时,我不会将“这是一个糟糕的编程”这个问题解释为“是不是糟糕的做法”。无论如何,问题是关于现有代码的,所以“如果 [作者] 了解他们在做什么,这不是坏习惯”是 1)对提问者(不是作者)没有用处和 2)坦率地说不好的建议,因为理解某事并不能使它成为良好的实践。仅仅因为我知道我在用 GOTOs 做什么并不能证明使用它们是合理的(因为下一个程序员可能不会使用该代码)。
猜你喜欢
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 2013-01-30
相关资源
最近更新 更多