Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::make_unique和std::unique_ptr之间的差异_C++_Unique Ptr - Fatal编程技术网

C++ std::make_unique和std::unique_ptr之间的差异

C++ std::make_unique和std::unique_ptr之间的差异,c++,unique-ptr,C++,Unique Ptr,这是一个后续问题 国家: make_unique对于创建临时表是安全的,而明确使用new时,您必须记住不使用未命名临时表的规则 我大致了解这是什么意思,我理解给出的示例,但这在内部是如何工作的?这些函数到底做什么?它们的区别在哪里 这些函数到底做什么?它们的区别在哪里 其实没什么神奇的。他们只是从以下内容转换用户代码: f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } ); f(std::un

这是一个后续问题

国家:

make_unique
对于创建临时表是安全的,而明确使用
new
时,您必须记住不使用未命名临时表的规则

我大致了解这是什么意思,我理解给出的示例,但这在内部是如何工作的?这些函数到底做什么?它们的区别在哪里

这些函数到底做什么?它们的区别在哪里

其实没什么神奇的。他们只是从以下内容转换用户代码:

f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
f(std::unique_ptr{new T1},std::unique_ptr{new T2});
为此:

f( make_unique<T1>(), make_unique<T2>() );
f(make_unique(),make_unique());
只是为了避免编译器命令如下操作的场景,因为它可能会在C++14(包括)之前执行此操作:

  • 新T1
  • 新T2
  • 先生成
    unique\u ptr
  • 生成第二个
    unique\u ptr
如果第二步(
new T2
)引发异常,则第一个分配的对象尚未被保护到
unique_ptr
中并泄漏

make_unique
函数实际上编写起来很简单,在C++11中被忽略了。它很容易在C++14中引入。在这两者之间,每个人都会编写自己的
make_unique
模板,或者用谷歌搜索斯蒂芬·T·拉瓦维(Stephen T.Lavavej)编写的模板


正如StoryTeller所评论的,自从C++17以来,这种交错是不允许的。

从C++17开始,阅读这种交错是不合法的。在兼容的C++17编译器上不会发生这种泄漏(尽管我仍然发现重复类型名称本身很糟糕)。@StoryTeller:我没有检查,但是C++17中是否有针对
unique\u ptr
的演绎指南?没有,甚至编译器生成的那些都被设计禁用。主要是因为演绎指南无法区分是否应该仅基于构造函数的参数来演绎
t*
t[]