gpt4 book ai didi

c++ - 为什么在 C++17 中使用 std::make_unique?

转载 作者:IT老高 更新时间:2023-10-28 12:01:02 31 4
gpt4 key购买 nike

据我了解,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 也安全,所以这是我的问题:还有使用 std::make_unique 的理由吗?超过 std::unique_ptr在 C++17 中的构造函数?你能举一些例子吗?

到目前为止,我能想象的唯一原因是它允许输入 MyClass只有一次(假设您不需要依赖 std::unique_ptr<Base>(new Derived(param)) 的多态性)。然而,这似乎是一个很弱的理由,尤其是当 std::make_unique std::unique_ptr 时不允许指定删除器的构造函数。

为了清楚起见,我并不是主张删除 std::make_unique来自标准库(至少为了向后兼容性保持它是有意义的),但想知道是否仍然存在强烈首选 std::unique_ptr 的情况

最佳答案

您说得对,主要原因已被删除。仍然有不要使用新的 准则,并且它是减少输入的原因(不必重复输入或使用单词 new )。诚然,这些不是强有力的论据,但我真的很喜欢看不到 new在我的代码中。

也不要忘记一致性。你绝对应该使用 make_shared所以使用 make_unique是自然的,适合图案。然后更改 std::make_unique<MyClass>(param) 就很简单了至std::make_shared<MyClass>(param) (或相反)语法 A 需要更多的重写。

关于c++ - 为什么在 C++17 中使用 std::make_unique?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53870522/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com