据我了解,C ++ 14的引入std::make_unique
是因为,由于未指定参数求值顺序,因此这是不安全的:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(说明:如果评估首先为原始指针分配内存,然后进行调用,g()
并且在std::unique_ptr
构造之前引发异常,则内存将泄漏。)
呼叫std::make_unique
是一种限制呼叫顺序的方法,从而使事情变得安全:
f(std::make_unique<MyClass>(param), g()); // Syntax B
从那时起,C ++ 17阐明了评估顺序,也使语法A变得安全,所以这是我的问题:在C ++ 17中仍然有理由使用std::make_unique
over std::unique_ptr
的构造函数吗?你能举一些例子吗?
到目前为止,我能想象的唯一原因是它只允许键入MyClass
一次(假设您不需要依赖于的多态性std::unique_ptr<Base>(new Derived(param))
)。但是,这似乎是一个很弱的原因,尤其是当的构造函数std::make_unique
不允许指定删除器时std::unique_ptr
。
只是要清楚一点,我不主张std::make_unique
从标准库中删除(至少保持向后兼容才有意义),而是想知道是否仍然存在强烈推荐使用标准库的情况。std::unique_ptr
std::make_unique
,那我就认为没有足够的理由将其添加到STL中,尤其是当它的语法表达能力不及使用构造函数时,更不用说了
std::unique_ptr
多久使用一次自定义删除器?这不是反对的理由make_unique