6

取自: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的右侧键入然后键入大量初始化=

我错过了什么?

4

3 回答 3

10

好吧,关键是第一个选项是pba unique_ptr<base>,而第二个选项是pba unique_ptr<derived>。在您的情况下两者是否正确取决于您必须处理的内容pb- 但绝对两者并不等同。

如果您的程序的相关部分需要使用 a 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"
// ...
于 2013-05-27T13:50:53.273 回答
6

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

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

如果是这样,那么对我来说,这将是非常值得怀疑的优点..

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

于 2013-05-27T14:10:49.013 回答
4
auto pb = unique_ptr<base>{ make_unique<derived>() };

上面创建了一个unique_ptr<base>包含 a 的 a derived

auto pb = make_unique<derived>();

上面创建了一个unique_ptr<derived>包含 a 的 a derived

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

顺便说一句,make_unique在链接到的文章中搜索会导致有人在那里回答这个问题。

于 2013-05-27T13:50:22.847 回答