Почему `make_unique <T [N]>` `запрещен?

Предположим, пространство именstd на протяжении.

Проект комитета C ++ 14 N3690 определяетstd::make_unique таким образом:

[n3690: 20.9.1.4]: unique_ptr создание [Unique.ptr.create] 1

template unique_ptr make_unique(Args&&... args);

 Примечания: эта функция не должна участвовать в разрешении перегрузки, если толькоT это не массив.2

 Возвращает: 3unique_ptr(new T(std::forward(args)...)).

template unique_ptr make_unique(size_t n);

 Примечания: эта функция не должна участвовать в разрешении перегрузки, если толькоT массив неизвестных границ.4

 Возвращает: 5unique_ptr(new typename remove_extent::type[n]()).

template unspecified make_unique(Args&&...) = delete;

 Примечания: эта функция не должна участвовать в разрешении перегрузки, если толькоT массив известных границ

Теперь мне кажется, что это почти так же ясно, как грязь, и я думаю, что это требует большей экспозиции. Но, если оставить в стороне этот редакционный комментарий, я считаю, чтоМы расшифровали значения каждого варианта:

template unique_ptr make_unique(Args&&... args);

Ваш болотный стандартmake_unique для не-массив типов. Предположительнозамечание» указывает, что некоторая форма статического утверждения или трюка SFINAE состоит в том, чтобы предотвратить успешное создание шаблона приT это тип массива

На высоком уровне рассматривайте его как эквивалент смарт-указателя.T* ptr = new T(args);

template unique_ptr make_unique(size_t n);

Вариант для типов массивов. Создает динамически распределенный массивn × Tsи возвращает его, завернутый в.unique_ptr

На высоком уровне рассматривайте его как эквивалент смарт-указателя.T* ptr = new T[n];

template unspecified make_unique(Args&&...)

Недопустимое. "неопределенные" вероятно будет.unique_ptr

В противном случае смарт-указатель будет эквивалентен чему-то недопустимому.T[N]* ptr = new (keep_the_dimension_please) (the_dimension_is_constexpr) T[N];

Прежде всего, я прав? И если да, то чтопроисходит с третьей функцией?

Если оно'чтобы запретить программистам пытаться динамически размещать массив, предоставляя аргументы конструктора для каждого элемента (так же, какnew int[5](args) невозможно), тогда этоуже охвачено тем фактом, что первая функция не может быть создана для типов массивов, isn 'не так ли?

Если оно's, чтобы предотвратить добавление к языку такой конструкции, какT[N]* ptr = new T[N] (гдеN это какой-тоconstexpr) ну и зачем? Wouldn»т это вполне возможно дляunique_ptr существовать, которое оборачивает динамически распределенный блокN × Ts? Будет ли это настолько плохой вещью, если комитет приложил все усилия, чтобы запретить его использование?make_unique

Почемуmake_unique запрещено?

Ответы на вопрос(2)

Ваш ответ на вопрос