Почему умные указатели не имеют оператора преобразования обратно в базовый указатель?

Если часто обнаруживаете, что используете такой код:

boost::scoped_ptr<TFoo> f(new TFoo);

Bar(f.get());  // call legacy or 3rd party function : void Bar (TFoo *)

Теперь, я думаю, умные указатели могли бы легко определить оператор неявного преобразования обратно в «необработанный» тип указателя, что позволило бы этому коду оставаться действительным и упростило «умное» устаревание кода.

Bar(f);

Но, по крайней мере, не те, которые я нашел. Зачем?

2

Решение

Неявное преобразование IMO — корень всего зла в c ++, и один из самых сложных видов ошибок, которые нужно отследить.

Хорошей практикой является не полагаться на них — вы не можете предсказать все виды поведения.

7

Другие решения

Потому что тогда очень легко случайно обойти умный указатель. Например, что если вы напишите:

delete f;

В вашем примере, плохие вещи могут случиться. Ваши функции могут быть похожими, они могут хранить свою собственную копию указателя, которая затем нарушает умный указатель. По крайней мере, вызов get заставляет вас думать, «это безопасно?»

2

По вопросам рекламы [email protected]