Почему std :: make_unique () не поддерживает ограниченные массивы? [дублировать]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему std :: make_unique () не поддерживает ограниченные массивы? [дублировать]

Сообщение Anonymous »

В этой таблице показана поддержка интеллектуального указателя для массива и неаропийных путей: < /p>



< /th>
< /th>










Код: Выделить всё

std::make_unique





< /tr>

Код: Выделить всё

std::make_unique


✗ < /strong> < /td>
< /tr>

Код: Выделить всё

std::shared_ptr 


















Почему std :: make_unique > () deleted?

Код: Выделить всё

std::make_unique()
был явно удален D, так как std :: make_unique был введен в C ++ 14.
обходной путь, который работает в C ++ 14,-это определение функции, подобной:

Код: Выделить всё

#include 
#include 
#include 

template
constexpr bool is_bounded_array_v = false;

template
constexpr bool is_bounded_array_v = true;

template
std::enable_if_t
make_unique()
{
return std::unique_ptr(reinterpret_cast(new std::remove_extent_t[std::extent::value]()));
}
Это использует new [] для выделения массива, разделив его t = e [n] на тип элемента e и экстент n , а затем повторный интернет Указатель управляется std :: ulious_ptr .
std :: default_delete появляется для работы, вызывая оператор «Удалить» [] на одном и том же адресу, возвращаемом новым [] . Удалить [] ).
Если это неопределенное поведение, если не используется DeleTer, который вызывает DELETE [] на Определенный тип указателя , который возвращается новым [] выше, тогда это можно использовать:


Подробнее здесь: https://stackoverflow.com/questions/797 ... ded-arrays
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»