I know they're different (and the construct unfortunately named optional has some occasional uses); it's just that the semantics of optional don't help it be used as a classic optional type.
> it's just that the semantics of optional don't help it be used as a classic optional type.
what do you mean "classic optional type"? boost.optional has worked like that for something like 20 years - it's been in C++ for longer than Maybe has been in Haskell.
And I think (hope?) that std::optional is going to make it's way into the dust bins of history like auto_ptr.
When the answer is "just don't deference it if it's null", then why not just use a pointer in the first place?