2017-05-24 21:43 GMT+02:00 Niall Douglas via Boost
There has been a fair bit of review feedback that people don't like the formal empty state in outcome<T> and result<T>. I still think this opinion daft, just because it's there doesn't mean you have to use it, but here are some options:
1. Like Expected, we could require the E types to provide a nothrow move constructor. This would allow us to guarantee no empty state, not ever. Default constructing an outcome<T> or result<T> would set a default constructed T state, just like Expected.
The only remaining difference now between result<T> and expected<T> would be the wide vs narrow observer functions. outcome<T> still can also carry a std::exception_ptr.
2. We could do the above, but default constructor constructs to some constexpr undefined state that is not state T nor E.
3. We could only provide a guarantee of no empty state if the E types provide nothrow move construction, but if they do not we fall back to an empty state arising if throws occur during assignment.
4. The option for an empty state becomes a template parameter defaulted to false i.e. disabled. This can be combined with any of the above.
Thoughts?
Let me just clarify the nomenclature here. I understand that the only thing you *need* to have is the *moved-form* state. There is no strong need to provide a default constructor. Sure if you have a moved-from state, you might as well use it in default constructor, but it is not the only option. You could allow the moved-from state only as the result of a move. Regards, &rzej;