unique_ptr,make_unique和polymorphism

时间:2015-03-11 19:57:16

标签: c++

如果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
}

这样你就可以用它来创建派生对象了吗?
有人知道不这样做的理性吗?

2 个答案:

答案 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