Я путаюсь с:
unique_ptr<char[]> u_ptr = make_unique<char[]>(10);
sprint(u_ptr.get(), 10, "milos"); // get returns char*
cout << u_ptr.get(); // get returns char*
И
shared_ptr<char[]> s_ptr = make_shared<char[]>(10);
sprint(*s_ptr.get(), 10, "milos"); // get here returns char** ?
cout << *s_ptr.get(); // get here returns char** ?
Итак, в то время как unique_ptr<char[]>
возвращает char*
для базового массива, shared_ptr<char[]>
, кажется, возвращает char(*)[]
указатель на указатель массива?
Я сделал несколько тестов, и я мог бы использовать shared_ptr<char>
с удалением по умолчанию:
shared_ptr<char> s_ptr(new char[10], default_delete<char[]>());
sprint(s_ptr.get(), 10, "milos"); // get here returns char*, fine
cout << s_ptr.get(); // same here
Но я предполагаю, что идея C ++ 17 заключается не в подходе с shared_ptr<char>
, а в специальном указателе удаления: default_delete<char[]>
, потому что это было возможно до C ++ 17.
Может ли кто-нибудь уточнить правильное использование и почему происходит следующее:
unique_ptr<int> u = make_unique<int>(5);
auto iu = u.get(); // iu is typeof int*
одновременно
unique_ptr<int[]> ua = make_unique<int[]>(5);
auto iua = ua.get(); // iua is still typeof int* ?
Пока для shared_ptr:
shared_ptr<int> s = make_shared<int>(5);
auto is = s.get(); // is is typeof int*
но
shared_ptr<int[]> sa = make_shared<int[]>(5);
auto isa = sa.get(); // isa is typeof int** ???
.