Re[4]: Чем boost::optional лучше чем NULL?
От: alzt  
Дата: 12.08.14 19:52
Оценка: +1
Здравствуйте, slava_phirsov, Вы писали:

Z>>из плюсов я бы назвал в первую очередь понятность кода (семантику). например, глядя на это:

Z>>
Z>>some* get_some();
Z>>boost::optional<some> get_other_some();
Z>>


Z>>не очень очевидно, что может вернуть `get_some()`, в то время как глядя на `get_other_some()` сразу понятно, что возвращает значения он не всегда.


_>Вкусовщина. Лично мне очевидно, что если в качестве возвращаемого значения задан указатель, то он может быть и нулевым, если, конечно, в документации специально не оговорено иное. С другой стороны, насколько я помню (смотреть лень, да-с) "пустой" boost::optional при попытке разыменовать его гарантированно выкинет исключение, а вот разыменование нулевого указателя — формально, UB. Правда, насколько мне известно, на любой платформе, где существует бюст, разыменование нулевого указателя дает ошибку доступа к памяти и завершение приложения.


Люди не любят проверять возвращаемое значение и часто это делают. Пример, функция malloc, её результат очень часто забывают проверить.
А вот с optional такое уже не прокатит.
Re[5]: Чем boost::optional лучше чем NULL?
От: slava_phirsov Россия  
Дата: 12.08.14 21:52
Оценка:
Здравствуйте, alzt, Вы писали:

A>Люди не любят проверять возвращаемое значение и часто это делают. Пример, функция malloc, её результат очень часто забывают проверить.

A>А вот с optional такое уже не прокатит.

Как тут где-то выше говорилось, если malloc вернет тебе NULL, а ты, не глядя, попытаешься его разыменовать, на PC ты получишь ошибку сегментации и приложение тупо вылетит. Если не проверишь optional — получишь вылет по BOOST_ASSERT. Разница? Вообще-то никакой.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re: Чем boost::optional лучше чем NULL?
От: antropolog  
Дата: 13.08.14 08:07
Оценка: +1 -1
Здравствуйте, Аноним, Вы писали:

А>Смотрю тут один код, повсеместно для указателей, которые могут указывать на объект, а могут не указывать никуда, применен boost::optional. Скажите, а чем такой подход лучше чем просто хранение NULL в указателе, если в данный момент он ни на что не указывает? Ведь проверять-то все равно надо, когда необходимо получить оттуда сам объект.


Лучше тем что явно выражает намерение. Как я могу узнать глядя на сигнатуру метода, что возвращаемый указатель может быть NULL и это валидное поведение (т.е. мне нужно писать if( ptr ) а не assert( ptr )? Только заглянув в имплементацию. boost::optional позволяет избежать этих лишних телодвижений и явно говорит о том что пустое возвращаемое значение не является нарушением инварианта.
Re[2]: Чем boost::optional лучше чем NULL?
От: Кодт Россия  
Дата: 13.08.14 14:40
Оценка:
Здравствуйте, antropolog, Вы писали:

A>Лучше тем что явно выражает намерение. Как я могу узнать глядя на сигнатуру метода, что возвращаемый указатель может быть NULL и это валидное поведение (т.е. мне нужно писать if( ptr ) а не assert( ptr )? Только заглянув в имплементацию. boost::optional позволяет избежать этих лишних телодвижений и явно говорит о том что пустое возвращаемое значение не является нарушением инварианта.


И ещё тем, что не предполагает полиморфизм, и предполагает монопольное/эстафетное владение
Some* foo()
{
  ... return new Some() ...
  ... return new Derived() ...
  ... return &g_some ...
  ... return &g_derived ...
  ... return nullptr ...
}

optional<Some> bar()
{
  ... return Some() ...
  ... return nullopt ...
}
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.