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

Yan*_*nko 6 c++ c++11 gotw c++14

取自:http://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/

我们为什么要写:

auto pb = unique_ptr<base>{ make_unique<derived>() };
Run Code Online (Sandbox Code Playgroud)

而不仅仅是:

auto pb = make_unique<derived>();
Run Code Online (Sandbox Code Playgroud)

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

如果是这样,那么对我来说,这将是真正值得怀疑的优点..键入auto然后在右侧输入很多初始化=..

我错过了什么?

And*_*owl 10

好吧,重点是第一个选项产生pb一个unique_ptr<base>,而第二个选项产生pb一个unique_ptr<derived>.在你的情况下两者是否正确取决于你要做什么pb- 但绝对两者并不相同.

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

例如:

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

鉴于:

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

  • C++现在很难看.我希望我的`new` /`delete`回来! (5认同)
  • Ew,原始`新!!! (3认同)

Mik*_*our 6

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

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

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

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