std
始终假定命名空间。
C++14 委员会草案 N3690 是std::make_unique
这样定义的:
[n3690: 20.9.1.4]:
unique_ptr
创建 [unique.ptr.create]
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
1
T
备注:除非不是数组,否则此函数不应参与重载决议。
2回报:unique_ptr<T>(new T(std::forward<Args>(args)...)).
template <class T> unique_ptr<T> make_unique(size_t n);
3
T
备注:除非是一个未知边界的数组,否则该函数不应参与重载决议。
4回报:unique_ptr<T>(new typename remove_extent<T>::type[n]()).
template <class T, class... Args> unspecified make_unique(Args&&...) = delete;
5备注:此函数不应参与重载决议,除非
T
是已知边界的数组。
现在,在我看来,这就像泥泞一样清晰,我认为它需要更多的阐述。但是,除了这篇社论评论,我相信我已经解码了每个变体的含义:
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
make_unique
您的非数组类型的沼泽标准。据推测,“备注”表示某种形式的静态断言或 SFINAE 技巧是为了防止模板在T
为数组类型时被成功实例化。在高层次上,将其视为等效于 的智能指针
T* ptr = new T(args);
。template <class T> unique_ptr<T> make_unique(size_t n);
数组类型的变体。创建一个动态分配的
n
×数组Ts
,并将其包装在 a 中返回unique_ptr<T[]>
。在高层次上,将其视为等效于 的智能指针
T* ptr = new T[n];
。template <class T, class... Args> unspecified make_unique(Args&&...)
不允许。“未指定”可能是
unique_ptr<T[N]>
。否则将是智能指针等价于 invalid
T[N]* ptr = new (keep_the_dimension_please) (the_dimension_is_constexpr) T[N];
。
首先,我说的对吗?如果是这样,第三个功能是怎么回事?
如果它不允许程序员在为每个元素提供构造函数参数的同时尝试动态分配数组(这
new int[5](args)
是不可能的),那么这已经被第一个函数不能为数组类型实例化的事实所涵盖,不是吗?T[N]* ptr = new T[N]
如果它的存在是为了防止像(whereN
is some )这样的结构添加到语言中,constexpr
那么,为什么?包装一个动态分配的× s块的a 不是完全有可能unique_ptr<T[N]>
存在吗?这会是一件坏事吗,以至于委员会已经竭尽全力禁止使用.N
T
make_unique
为什么make_unique<T[N]>
不允许?