could you point to some explanation, as to why hard UB was preferred over a compile time error in the first place?
It was a long time ago, and my memory may be faulty. But I think that the general reasoning was that value-from-valueless is a logic error, that means the program is incorrectly coded, that means hard UB. I remember ancillary arguments about it being preferable that the UB sanitiser fire on that logic error, that assert fires if NDEBUG is not defined, and so on. So the hard UB only occurs in release builds, where it invariably segfaults rather than being silent. So, basically boost-dev, at that time, felt that *run time* value-from-valueless on UDT error types ought to be treated as program incorrectness. As I mentioned, most of Outcome's users - and there are a quite a few of them - seem very keen on this hard UB. However these early adopters are not the typical Boost user base. And I do buy in to Andrzej's point that the current default will likely be surprising to the average C++ programmer who does not read the documentation, and to the developer who changes the error type without changing the customisation points to match. Also, Outcome underwent two reviews here. They were in depth. At the time, I don't remember anybody finding issue with UDT error types defaulting to hard UB. But maybe my memory is wrong. And of course, boost-dev can always change their mind if a consensus presents here in favour of that. I just didn't want to change Outcome in such a non-reviewed way without getting approval here first. Niall