It's not that exceptions are terrible. I have nothing against them. The thing is that most of the time they are not affordable, especially in embedded. Some compilers don't even support them (some 8-bit IIRC). Most (including mine) embedded C++ programs have exceptions disabled.
> return a `std::optional`
The same goes for std. I don't know the overhead of possibly duplicating these classes(1) for every instance of std::optional. Most (including mine) embedded C++ programs don't use std.
30KB of extra code is nothing for desktop/server applications, but it's not convenient for a MCU with 64KB of flash.
(1): https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-...
> just use a factory function instead
This is practical with an efficient heap allocator (which I might not have). What happens if I want a scoped (on stack) instance of a class?
See how things are quickly getting more complicated with C++?