C++ 是否允许将唯一\u ptr分配给共享\u ptr? std::将映射字符串映射到对象指针; 将_字符串_映射到_对象_指针[“abcd”]=std::make_unique();

C++ 是否允许将唯一\u ptr分配给共享\u ptr? std::将映射字符串映射到对象指针; 将_字符串_映射到_对象_指针[“abcd”]=std::make_unique();,c++,C++,问题是如何将唯一的\u ptr分配给共享的\u ptr。这是一个现有的代码,因此只是试图了解它是否是一个糟糕的编程或将unique赋值给shared_ptr会将unique_ptr隐式转换为shared?因此没有编译器警告。是,这将调用相应的赋值运算符: std::map<std::string, std::shared_ptr<SomeClass>> map_string_to_object_pointer; map_string_to_object_pointer

问题是如何将唯一的\u ptr分配给共享的\u ptr。这是一个现有的代码,因此只是试图了解它是否是一个糟糕的编程或将unique赋值给shared_ptr会将unique_ptr隐式转换为shared?因此没有编译器警告。

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

std::map<std::string, std::shared_ptr<SomeClass>> map_string_to_object_pointer;


map_string_to_object_pointer["abcd"] = std::make_unique<SomeClass>();
template
共享\u ptr&operator=(标准::唯一\u ptr&r);

和都存在这样的过载(即使
std::auto_ptr
被接受为0_o.)


事实上,只有一种糟糕的编程实践:在不知道自己在做什么的情况下做一些事情。其他一切都可以接受。

为什么不可以?它甚至比指定常规指针更安全,不过在这种情况下,使用
make_unique
而不是
make_shared
@lubgr没有意义。感谢您对副本的引用。这正是我想要的。我要添加的唯一一件事是,您需要std::将一个唯一的\u ptr移动到一个共享的\u ptr中,这由构造函数的右值引用签名表示。它在最初发布的代码中起作用的原因是,调用make_unique是一个右值。我不认为这个答案中的随机注释会增加任何内容。恰恰相反。@MaxLanghof对不起?我想让你知道,我觉得第二段与这个问题既不一致,也不相关。确切地说是怎样的?问题是“这是否是一个糟糕的编程”,我试图给出最详细的答案。当标题专门询问“允许”时,我不会将“这是否是一个糟糕的编程”理解为“这是否是一个糟糕的做法”。不管怎样,问题是关于现有代码的,因此“如果[作者]了解他们在做什么,这不是一个坏做法”,1)对提问者(不是作者)没有用处,2)坦率地说,这是一个坏建议,因为了解某些东西并不能成为一个好做法。仅仅因为我知道我在使用
GOTO
s做什么,就不能证明使用它们是合理的(因为下一个处理该代码的程序员可能不会这样做)。
 template< class Y, class Deleter > 
 shared_ptr& operator=( std::unique_ptr<Y,Deleter>&& r );