Почему не очевидное использование `std :: shared_ptr работа? - PullRequest
4 голосов
/ 19 января 2020

Кажется, что очевидное использование std::shared_ptr<T[]> (добавлено в C ++ 17) - удерживать указатель на T и использовать delete[], когда пришло время уничтожать управляемый объект. Но этот код:

#include <memory>

int main() {
    std::shared_ptr<int[]> sp(new int[3]);
    return 0;
}

не компилируется ни с одним из онлайн-компиляторов, которые я пробовал. Во всех случаях сообщение об ошибке является вариантом этого:

/ Library / Developer / CommandLineTools / usr / bin /../ include / c ++ / v1 / memory: 3759: 18: note: шаблон кандидата игнорируется: требование 'is_convertible :: value 'не был удовлетворен [с _Yp = int] явным shared_ptr (_Yp * __p,

, то есть конструктор, который берет указатель, получает SFINAED, поскольку указатель на тип элемента isn' • преобразуется в указатель на массив. Это, по-видимому, требуется в стандарте C ++ 17 и в C ++ 20.

Это действительно то, что предназначено? Как я могу использовать этот конструктор? Или, как альтернатива, как создать std::shared_ptr объект, который правильно управляет массивом без явного указания удалителя?

...