Этот ответ цитирует 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не является типом массива, должно быть хорошо сформировано, должно иметь четко определенное поведение и не должно генерировать исключения. ЕслиTU[N],Y(*)[N]должен быть конвертирован вT*; когдаTU[],Y(*)[]должен быть конвертирован вT*; в противном случаеY*должен быть конвертирован вT*.
Если я ошибаюсь, Y(*)[N] может быть сформирован только с помощью адреса массива, который явно не может быть использован или удален с помощью shared_ptr. Я также не вижу никаких указаний на то, что N используется каким-либо образом для обеспечения размера управляемого объекта.
Какова мотивация разрешения синтаксиса T[N]? Получает ли она какую-либо фактическую выгоду, и если да, то как она используется?