繁体   English   中英

为什么要使用make_unique调用初始化unique_ptr?

[英]Why initialize unique_ptr with a make_unique call?

取自: 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 ,我们需要帮助它推断出正确的类型(这里是base )。

如果是这样,那么对我来说,这将是非常值得怀疑的...键入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"
// ...

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

这是完全正确的。 没有转换, pb将是一个指向derived的指针,可能不是你想要的。 例如,您无法将其重新分配给拥有base或其他派生类对象。

如果是这样,那么对我来说这将是值得怀疑的功绩。

我倾向于同意。 作者在评论中注意到他这样做是因为他喜欢尽可能多地使用类型推导,并在必要时进行明确的转换。 时间将证明这种风格是否变得司空见惯。

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

上面创建了一个包含derivedunique_ptr<base>

auto pb = make_unique<derived>();

上面创建了一个包含derivedunique_ptr<derived>

虽然用第一个替换第二个是可以接受的,但它们实际上做了不同的事情。

make_unique ,在链接文章中搜索make_unique导致有人在那里回答这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM