与std::Make_Unique()相比,std::Make_Unique_for_Overwrite()做了什么?

2022-05-16 00:00:00 c++ c++20 smart-pointers

似乎在C++20中,我们获得了一些用于智能指针的附加实用函数,包括:

template<class T> unique_ptr<T> make_unique_for_overwrite();
template<class T> unique_ptr<T> make_unique_for_overwrite(size_t n);

std::make_sharedstd::shared_ptr相同。为什么现有函数不是:

template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // with empty Args
template<class T> unique_ptr<T> make_unique(size_t n);

够了吗?现有的不是使用对象的默认构造函数吗?

注意:在这些函数的早期提议中,名称为make_unique_default_init()


解决方案

这些新函数与不同:

  • 原始make_XYZ:始终初始化指向的值(显式初始化和显式初始化,请参阅standard中的§class.expl.init)。
  • make_XYZ_for_overwrite:执行指向的值的&Quot;默认初始化(参见standard中的§dcl.init第7段);在典型计算机上,这意味着对于非类、非数组类型实际上没有初始化。(是的,这个术语有点令人困惑;请阅读链接中的段落。)

这是普通指针的一个功能,这是智能指针实用程序函数所不具备的:使用常规指针,您只需分配指针,而无需实际初始化指向的值:

new int

对于唯一/共享指针,您只能通过包装现有指针来实现此目的,如下所示:

std::unique_ptr<int[]>(new int[n])

现在我们有了它的包装函数。

注意:请参阅相关的ISO C++WG21proposal和this SO answer

相关文章