Этот ответ цитирует N4082, который показывает, что предстоящие изменения до std::shared_ptr
разрешает варианты T[]
и T[N]
:
В отличие от частичной специализации
unique_ptr
для массивов, какshared_ptr<T[]>
, так иshared_ptr<T[N]>
будут действительны, и оба они приведут к вызовуdelete[]
в управляемом массиве объектов.template<class Y> explicit shared_ptr(Y* p);
Требуется:
Y
должен быть полным типом. Выражениеdelete[] p
, когдаT
является типом массива илиdelete p
, когдаT
не является типом массива, должно быть хорошо сформировано, должно иметь четко определенное поведение и не должно генерировать исключения. ЕслиT
U[N]
,Y(*)[N]
должен быть конвертирован вT*
; когдаT
U[]
,Y(*)[]
должен быть конвертирован вT*
; в противном случаеY*
должен быть конвертирован вT*
.
Если я ошибаюсь, Y(*)[N]
может быть сформирован только с помощью адреса массива, который явно не может быть использован или удален с помощью shared_ptr
. Я также не вижу никаких указаний на то, что N
используется каким-либо образом для обеспечения размера управляемого объекта.
Какова мотивация разрешения синтаксиса T[N]
? Получает ли она какую-либо фактическую выгоду, и если да, то как она используется?