Так как С++ 17 поддерживает shared_ptr массива, означает ли это, что явный делектор для T [] больше не требуется как для ctor, так и для reset?

При создании shared_ptr с использованием выделенного выделения в С++ 14 ctor и reset функция члена должна быть указана явная функция удаления.

using std::string;
using std::shared_ptr;
using std::default_delete;
int arr_size{};
...


auto string_arr_sptr_cpp14 = 
         shared_ptr<string[]>(new string[arr_size], default_delete<string[]>() );
string_arr_sptr_cpp14.reset(new string[arr_size], default_delete<string[]>() );
// define an explicit deleter, 
// or otherwise, "delete ptr;" will internally be used incorrectly!

Поддерживая функцию shared_ptr для массива в С++ 17, будут ли они больше не нужны как для ctor, так и для reset?

auto string_arr_sptr_cpp17 = shared_ptr<string[]>(new string[arr_size]);
string_arr_sptr_cpp14.reset(new string[arr_size]);
// deduced delete function calls "delete[] ptr;" correctly now?

Ответ 1

Вы правы, shared_ptr<T[]> теперь, естественно, правильно обрабатывает delete[].

http://eel.is/c++draft/util.smartptr.shared#const-5

Эффекты: Когда T не является типом массива, создается объект shared_ptr, которому принадлежит указатель p. В противном случае создается shared_ptr, которому принадлежат p и удалённость неуказанного типа, который вызывает delete [] p.

И что касается reset():

http://eel.is/c++draft/util.smartptr.shared#mod-3

Эквивалент shared_ptr (p).swap(* this).

Будет передан требуемый спецификацией пользовательский отладчик.