Z>>не очень очевидно, что может вернуть `get_some()`, в то время как глядя на `get_other_some()` сразу понятно, что возвращает значения он не всегда.
_>Вкусовщина. Лично мне очевидно, что если в качестве возвращаемого значения задан указатель, то он может быть и нулевым, если, конечно, в документации специально не оговорено иное. С другой стороны, насколько я помню (смотреть лень, да-с) "пустой" boost::optional при попытке разыменовать его гарантированно выкинет исключение, а вот разыменование нулевого указателя — формально, UB. Правда, насколько мне известно, на любой платформе, где существует бюст, разыменование нулевого указателя дает ошибку доступа к памяти и завершение приложения.
Люди не любят проверять возвращаемое значение и часто это делают. Пример, функция malloc, её результат очень часто забывают проверить.
А вот с optional такое уже не прокатит.
Здравствуйте, alzt, Вы писали:
A>Люди не любят проверять возвращаемое значение и часто это делают. Пример, функция malloc, её результат очень часто забывают проверить. A>А вот с optional такое уже не прокатит.
Как тут где-то выше говорилось, если malloc вернет тебе NULL, а ты, не глядя, попытаешься его разыменовать, на PC ты получишь ошибку сегментации и приложение тупо вылетит. Если не проверишь optional — получишь вылет по BOOST_ASSERT. Разница? Вообще-то никакой.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Здравствуйте, Аноним, Вы писали:
А>Смотрю тут один код, повсеместно для указателей, которые могут указывать на объект, а могут не указывать никуда, применен boost::optional. Скажите, а чем такой подход лучше чем просто хранение NULL в указателе, если в данный момент он ни на что не указывает? Ведь проверять-то все равно надо, когда необходимо получить оттуда сам объект.
Лучше тем что явно выражает намерение. Как я могу узнать глядя на сигнатуру метода, что возвращаемый указатель может быть NULL и это валидное поведение (т.е. мне нужно писать if( ptr ) а не assert( ptr )? Только заглянув в имплементацию. boost::optional позволяет избежать этих лишних телодвижений и явно говорит о том что пустое возвращаемое значение не является нарушением инварианта.
Здравствуйте, antropolog, Вы писали:
A>Лучше тем что явно выражает намерение. Как я могу узнать глядя на сигнатуру метода, что возвращаемый указатель может быть NULL и это валидное поведение (т.е. мне нужно писать if( ptr ) а не assert( ptr )? Только заглянув в имплементацию. boost::optional позволяет избежать этих лишних телодвижений и явно говорит о том что пустое возвращаемое значение не является нарушением инварианта.
И ещё тем, что не предполагает полиморфизм, и предполагает монопольное/эстафетное владение