Вы смотрите на все это в обратном направлении.
В C ++ 98/03 мы получили auto_ptr
. Этот тип лжет всем, притворяясь, что он поддерживает семантику копирования, когда на самом деле копирование делает что-то очень похожее на операцию копирования. Следовательно, любой тип, основанный на типе, обеспечивающем семантику копирования, например некоторые контейнеры, не сможет получить auto_ptr
. Конечно, вы узнаете, только когда ваш код станет нефункциональным, а не во время компиляции.
В C ++ 11 мы получили unique_ptr
, тип, который явно не обеспечивает семантику копирования. Вместо этого он предоставляет семантику перемещения и предоставляет их правильно. Следовательно, любой тип, основанный на типе, обеспечивающем семантику копирования, не сможет скомпилироваться, если ему дано unique_ptr
.
Однако , причина unique_ptr
возникла вообще, потому что концепцияперемещения объекта был добавлен в язык в C ++ 11. Когда в язык добавляются новые концепции, существующие инструменты, такие как требования стандартной библиотеки, часто переоцениваются относительно этой языковой функции.
Например, типы, для которых ранее требовалась семантика копирования, не обязательно должны были сохранять это. требование. Контейнеры C ++ 98/03, которым требовалась семантика копирования, были обновлены в C ++ 11, чтобы требовать (не исключая) только семантику перемещения из типа.
Так что unique_ptr
не удовлетворяет некоторому требованию, что auto_ptr
не. Дело в том, что язык изменился и больше не нуждается в этом требовании, но auto_ptr
все еще лгал о том, что он сделал, поэтому для обратной совместимости мы создали новый тип, который уважал новые возможности языка и не лгал людям.