Andrzej Krzemienski wrote:
To expand on that a bit:
T* operator->() const noexcept; Requires: get() != nullptr. Returns: get().
Narrow, a mistake.
You say, you do not like the above, right? You call this mistake *only* because of this LWG guideline?
For shared_ptr, it is a mistake, period. The function does not require get() != nullptr in order to do its job, so it should not have a precondition. { return get(); } is fine.
T* operator->() const noexcept; Returns: get().
Wide, as it should have been.
You say, you like the above, right? But what does it mean? That it returns a `(T*)nullptr` ?
For shared_ptr, it just returns the pointer. For result<>, yes, it would return a nullptr when no T is present, not an invalid pointer value.
This is the same as your value_if?
Yes, as I wrote,
All that said, I'm actually not opposed to outcome<T>::op-> being the second above (the equivalent of value_if) and op* being effectively *operator->().