Почему `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
× T
s? Будет ли это настолько плохой вещью, если комитет приложил все усилия, чтобы запретить его использование?make_unique
Почемуmake_unique
запрещено?