如果make_unique
设计为:{/ p>,则不会更有用
template< typename T, typename U=T, typename ...ArgT>
unique_ptr<T> make_unique( ArgT ...args )
{
return unique_ptr<T>( new U(args...) );
// maybe parameters should be forwarded, not really important for this question
}
这样你就可以用它来创建派生对象了吗?
有人知道不这样做的理性吗?
答案 0 :(得分:6)
因为没有意义,所以无论如何都可以在转换后进行转换。
std::unique_ptr<T> p = std::make_unique<U>(args);
因此,如果有一个函数需要std::unique_ptr<T>
,你仍然可以
func(std::make_unique<U>(args));
对于您的实例,您可以这样做:
the_list.push_back( make_unique<Child>(1) );
你的建议有什么好处?它似乎无缘无故地打字。
(另外,一般来说这不安全,因为它假定基类有一个虚拟析构函数,你需要小心转换unique_ptr
个对象,所以有一个make_unique
鼓励它可能风险很大。)
答案 1 :(得分:0)
如果您仔细研究std :: unique_ptr的定义,就会发现它可以从派生的转移到基数。请参阅https://stackoverflow.com/a/57797286/3758879