根据N3797,std::make_unique
有三个“重载”:
20.8.1.4 unique_ptr creation [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 remove_extent_t<T>[n]())
。
template <class T, class... Args>
unspecified
make_unique(Args&&...) = delete;
5 备注:除非
T
是已知绑定的数组,否则此函数不应参与重载决策。
我不明白第三个删除重载的原因。如果T
是已知边界的数组,则前两个不参与重载决策,那么为什么标准指定第三个?将它遗漏并仅指定前两个过载是不是完全相同?
编辑:请注意,我知道为什么不允许make_unique<T[N]>
。问题不在于此,而是为什么需要第三次重载。 AFAICT,拥有或不拥有它的效果是相同的,甚至是make_unique<T[N]>
。