c – 为什么用make_unique调用初始化unique_ptr?

前端之家收集整理的这篇文章主要介绍了c – 为什么用make_unique调用初始化unique_ptr?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
取自: http://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/

我们为什么要写:

auto pb = unique_ptr<base>{ make_unique<derived>() };

而不仅仅是:

auto pb = make_unique<derived>();

我唯一的猜测是,如果我们想要自动,我们需要帮助它推断出正确的类型(这里是基础).

如果是这样,那么对我来说,这将是非常值得怀疑的…键入auto然后在=的右侧键入大量初始化.

我错过了什么?

解决方法

好吧,重点是第一个选项使pb成为unique_ptr< base>,而第二个选项使pb成为unique_ptr< derived>.在你的情况下两者是否正确取决于你与pb有什么关系 – 但绝对两者并不相同.

如果程序的相关部分需要使用unique_ptr< base> (也许是因为稍后你会让它指向一个不同派生类的实例),那么第二种解决方案根本不可行.

例如:

auto pb = unique_ptr<base>{ make_unique<derived>() };
// ...
pb = make_unique<derived2>(); // This is OK
// ...

鉴于:

auto pb = make_unique<derived>();
// ...
pb = make_unique<derived2>(); // ERROR! "derived2" does not derive from "derived"
// ...

猜你在找的C&C++相关文章