В чем опасность передачи auto_ptr функции, ожидающей постоянной ссылки на auto_ptr?
Николай Йосуттис в своей книге "Стандартная библиотека C++ - учебное пособие и справочник" пишет на стр. 44 следующий абзац:
Согласно концепции auto_ptrs, можно передать владение функцией, используя постоянную ссылку. Это очень опасно, потому что люди обычно ожидают, что объект не будет изменен, когда вы передадите его как постоянную ссылку. К счастью, было позднее дизайнерское решение, которое сделало auto_ptrs менее опасным. По некоторым хитрым методам реализации передача права собственности невозможна при постоянных ссылках. Фактически, вы не можете изменить владельца любой константы auto_ptr: …
Если невозможно изменить владельца с постоянной ссылкой, почему выражения "Это очень опасно" и "менее опасно" выше?
1 ответ
Подводя итоги комментариев:
"Это очень опасно" относится к std::auto_ptr<>
Конструктор копирования (который передает владение) принял аргумент const reference - это полное нарушение правильности const.
"Менее опасный" относится к тому факту, что конструктор копирования (который теперь принимает неконстантную ссылку) может вообще передать право собственности; это все еще опасно, просто не так опасно, как когда конструктор копирования получил ссылку на const.
Этот аспект std::auto_ptr<>
повсеместно считается недостатком в классе, в той степени, в которой его считают неприлично сломанным. Как следствие, boost::scoped_ptr<>
а также boost::shared_ptr<>
в основном считаются "настоящими" умными указателями в C++03 и в C++11 std::auto_ptr<>
не рекомендуется вообще в пользу std::unique_ptr<>
(и полностью удалено в C++17).
Обновление: Начиная с Boost 1.57, библиотека Boost.Move теперь поддерживает эмуляцию C++03 std::unique_ptr<>
который следует использовать, а не boost::scoped_ptr<>
: boost::movelib::unique_ptr<>
,