2017-08-03 38 views
11

Po utworzeniu shared_ptr przy użyciu oddzielnego przydziału, należy jawnie usunąć funkcję w C++ 14 ctor i zresetować funkcję członka.Ponieważ C++ 17 obsługuje shared_ptr of array, czy oznacza to, że jawny deleter dla T [] nie jest już wymagany w Ctor i Reset?

Wspierając funkcję shared_ptr z macierzy w C++ 17, czy nie byłyby one już wymagane w Ctor i 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? 

Odpowiedz

2

Jesteś poprawne, shared_ptr<T[]> teraz naturalnie uchwyty nazywając delete[] prawidłowo.

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

Efekty: Kiedy T nie jest typu array, konstruuje obiekt shared_ptr, która jest właścicielem wskaźnik p. W przeciwnym razie konstruuje plik shared_ptr, który jest właścicielem p i , deletera o nieokreślonym typie, który wywołuje delete [] p.

I o ile reset() idzie:

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

Odpowiednik shared_ptr (p) .swap (* this).

Który przeniesie specyfikację wymaganego niestandardowego deletera.

+0

Czy to oznacza, że ​​główna rola std :: default_delete <>() również zniknęła? – sandthorn

+1

'std :: default_delete <>()' jest związane z 'unique_ptr <>', co jest inną sprawą. – Frank