gpt4 book ai didi

c++ - 为什么不允许使用 `make_unique`?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:12 24 4
gpt4 key购买 nike

假设命名空间 std贯穿始终。

C++14 委员会草案 N3690 定义了 std::make_unique因此:

[n3690: 20.9.1.4]: unique_ptr creation    [unique.ptr.create]

template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);

1 Remarks: This function shall not participate in overload resolution unless T is not an array.
2 Returns: unique_ptr<T>(new T(std::forward<Args>(args)...)).

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

3 Remarks: This function shall not participate in overload resolution unless T is an array of unknown bound.
4 Returns: unique_ptr<T>(new typename remove_extent<T>::type[n]()).

template <class T, class... Args> unspecified make_unique(Args&&...) = delete;

5 Remarks: This function shall not participate in overload resolution unless T is an array of known bound.

现在,这对我来说似乎是一团糟,我认为它需要更多的阐述。但是,除了这篇社论评论,我相信我已经解码了每个变体的含义:

  1. template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);

    你的沼泽标准make_unique对于非数组类型。据推测,“备注”表明某种形式的静态断言或 SFINAE 技巧是为了防止模板在 T 时被成功实例化。是数组类型。

    在高层次上,将其视为等同于 T* ptr = new T(args); 的智能指针.

  2. template <class T> unique_ptr<T> make_unique(size_t n);

    数组类型的变体。创建一个动态分配的数组 n × Ts , 并将其包裹在 unique_ptr<T[]> 中返回.

    在高层次上,将其视为等同于 T* ptr = new T[n]; 的智能指针.

  3. template <class T, class... Args> unspecified make_unique(Args&&...)

    不允许。 “未指定”可能是 unique_ptr<T[N]> .

    否则智能指针相当于无效的T[N]* ptr = new (keep_the_dimension_please) (the_dimension_is_constexpr) T[N]; .

首先,我是对的吗?如果是这样,第三个功能是怎么回事?

  • 如果它禁止程序员在为每个元素提供构造函数参数时尝试动态分配数组(就像 new int[5](args) 是不可能的),那么第一个函数不能为数组类型实例化,不是吗?

  • 如果它是为了防止在语言中添加类似 T[N]* ptr = new T[N] 的结构(其中 N 是一些 constexpr )那么,为什么? unique_ptr<T[N]> 不是完全有可能吗?存在包装一个动态分配的 block N × T秒?如果委员会已经竭尽全力禁止使用 make_unique 创建它,这会是一件坏事吗? ?

为什么是make_unique<T[N]>不允许?

最佳答案

引自the original proposal :

T[N]

As of N3485, unique_ptr doesn't provide a partial specialization for T[N]. However, users will be strongly tempted to write make_unique<T[N]>(). This is a no-win scenario. Returning unique_ptr<T[N]> would select the primary template for single objects, which is bizarre. Returning unique_ptr<T[]> would be an exception to the otherwise ironclad rule that make_unique<something>() returns unique_ptr<something>. Therefore, this proposal makes T[N] ill-formed here, allowing implementations to emit helpful static_assert messages.

该提案的作者 Stephan T. Lavavej 在 this video on Core C++ 中说明了这种情况。 (由 chris 提供),从 1:01:10 分钟开始(或多或少)。

关于c++ - 为什么不允许使用 `make_unique<T[N]>`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com