В чем опасность передачи auto_ptr функции, ожидающей постоянной ссылки на auto_ptr? - PullRequest
2 голосов
/ 21 февраля 2012

Николай Йосуттис в своей книге «Стандартная библиотека C ++ - учебное пособие и справочник» пишет на стр. 44 следующий абзац:

В соответствии с концепцией auto_ptrs можно передать владение функцией, используя постоянную ссылку. Это очень опасно, потому что люди обычно ожидают, что объект не будет изменен, когда вы передадите его как постоянную ссылку. К счастью, было позднее дизайнерское решение, которое сделало auto_ptrs менее опасным. По некоторым хитрым методам реализации передача права собственности невозможна при постоянных ссылках. Фактически, вы не можете изменить владельца любой константы auto_ptr: & hellip;

Если невозможно изменить владельца с постоянной ссылкой, почему выражения «Это очень опасно» и «менее опасно» выше?

1 Ответ

5 голосов
/ 21 февраля 2012

Подведение итогов комментариев:

«Это очень опасно» относится к случаю, когда конструктор копирования std::auto_ptr<> (который передает владение) принял константный ссылочный аргумент - это полныйнарушение const-правильности .

«Менее опасный» относится к тому факту, что конструктор копирования (который теперь принимает неконстантную ссылку) может вообще передать право собственности;это все еще опасно, просто не , как опасно, как тогда, когда конструктор копирования получил константную ссылку.

Этот аспект std::auto_ptr<> повсеместно считается недостатком в классе, посколькуэто вообще считается необычно сломанным.Следовательно, boost::scoped_ptr<> и boost::shared_ptr<> в значительной степени считаются «настоящими» умными указателями в C ++ 03 и в C ++ 11 * 1023.* полностью устарела в пользу std::unique_ptr<> (и полностью удалена в C ++ 17).


Обновление: Начиная с Boost 1.57,Библиотека Boost.Move теперь предоставляет эмуляцию C ++ 03 std::unique_ptr<>, которую следует использовать вместо boost::scoped_ptr<>: boost::movelib::unique_ptr<>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...