С появлением нового стандарта (и частей, уже доступных в некоторых компиляторах), новый тип std::unique_ptr
должен заменить его std::auto_ptr
.
Их использование в точности совпадает (поэтому я могу выполнить глобальный поиск / замену в моем коде (не то, чтобы я это делал, но если бы я это сделал)) или я должен знать о некоторых различиях, которые не очевидны при чтении документации?
Кроме того, если это прямая замена, зачем давать ему новое имя, а не просто улучшать std::auto_ptr
?
источник
std::auto_ptr
иstd::unique_ptr
несовместимы в некоторых случаях и падение замены в других. Таким образом, поиск / замена не достаточно хорош. Однако после поиска / замены, работающего с ошибками компиляции, следует исправить все, кроме странных угловых случаев. Большинство ошибок компиляции потребует добавленияstd::move
.совместимость на 100%, если вы не передаете ее по значению другой функции.
не на 100% совместимый, но на 99% совместимый не кажется неправильным.
100% совместимость с одним предупреждением,
unique_ptr
s должны быть переданы черезstd::move
вызов. Это просто, так как компилятор будет жаловаться, если вы не поняли это правильно.100% совместимость.
эта хитрая.
std::auto_ptr
Семантика копирования зла. Если класс запрещает копирование, тогдаstd::unique_ptr
замена заменяется. Однако, если вы попытались дать разумную семантику копирования классу, вам придется изменитьstd::auto_ptr
код обработки. Это просто, так как компилятор будет жаловаться, если вы не понимаете это правильно. Если вы разрешили копировать класс сstd::auto_ptr
участником без какого-либо специального кода, то позор вам и удачи.Таким образом,
std::unique_ptr
это непрерывныйstd::auto_ptr
. Он запрещает во время компиляции поведения, которые часто были ошибками при использованииstd::auto_ptr
. Так что, если вы используетеstd::auto_ptr
с должной осторожностью, переключение наstd::unique_ptr
должно быть простым. Если вы полагались наstd::auto_ptr
странное поведение, то вам все равно нужно реорганизовать свой код.источник
AFAIK,
unique_ptr
это не прямая замена. Основным недостатком, который он исправляет, является неявная передача права собственности.С другой стороны,
unique_ptr
появятся совершенно новые возможности: их можно хранить в контейнерах.источник
auto_ptr
не допускаются.У Херба Саттера есть хорошее объяснение на GotW # 89 :
Другими словами, хотя глобальный поиск и замена может временно «сломать» ваш код, вы все равно должны это сделать: это может занять некоторое время, чтобы исправить ошибки компиляции, но избавит вас от многих проблем в долгосрочной перспективе.
источник