这个问题是对this question的跟进。
make_unique
对于创建临时文件是安全的,而显式使用new
则必须记住关于不使用未命名临时文件的规则
我大致理解了这是什么意思,并且我理解了给出的示例,但是在内部它是如何工作的呢?这些功能究竟有什么作用,区别在哪里?
答案 0 :(得分:5)
这些功能究竟有什么作用,区别在哪里?
实际上没有什么神奇的。他们只是从中转换用户代码:
f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
对此:
f( make_unique<T1>(), make_unique<T2>() );
只是为了避免编译器按如下所示命令操作的情况,因为它可能会在C ++ 14(包括)之前执行:
new T1
new T2
unique_ptr
unique_ptr
如果第二步(new T2
)引发异常,则第一个分配的对象尚未固定到unique_ptr
中并泄漏。
make_unique
函数实际上很容易编写,但C ++ 11却忽略了它。它已在C ++ 14中轻松引入。在这两者之间,每个人都将编写自己的make_unique
模板,或在Google上搜索由Stephen T. Lavavej编写的模板。
正如StoryTeller所评论的那样,自C ++ 17起,不再允许这种交织。