2017-05-30 15:51 GMT+02:00 Niall Douglas via Boost
On 30/05/2017 13:25, Peter Dimov via Boost wrote:
Niall Douglas wrote:
value() id wide operator*() is narrow.
Why? Just because optional made that mistake?
The motivation here is that in
if( o ) { o->this_(); o->that(); o->this_other_thing(); o->that_too();
o->almost_forgot(); }
there is needless replication of the check. This, as I already mentioned, stems from a desire to operate on the value inside 'o' directly, which is not my preferred style in result's case, where I'd prefer to extract it instead.
Oh I get that was the motivation, and that's exactly where I find the most objection with Optional: it has some pointer semantics, but it is not a pointer, and so shouldn't be pretending to be one. It not being a pointer should have always been made clear to end users (by forcing them type more boilerplate) to extract immediately or else bind a lvalue ref to the internally stored value. Don't treat not-a-pointer as a pointer.
Maybe, but at least for optional you have one value that you can "refer" to or not. In case of `expected` it is even harder to defent this, because the E in a way is also a value.
I also, weirdly enough given the discussion till now, really dislike the wide contracts anywhere on Optional. Unlike Expected or Outcome, the compiler can instantly tell if you're being stupid when using Optional. So I'd have chosen all narrow observers personally, and have the compiler error with obvious UB usage and warn if you observe an Optional returned by an extern function without checking its state first. But that ship has sailed sadly.
The primary interface for accessing optional's contained value (operator* and operator->) have narrow contract. Regards, &rzej;