取自:
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" // ...