Can you clarify what you goals for optional values are. Do you want to distinguish an unset value from any other value? If the value is not set do you want it to not use any space on the wire? Do you want an older message definition (without the optional field) be compatible with a newer variation of the message (with the optional field added)?
I don’t understand how C++14 / C++17 is related to this and what you mean with “experimental optional implementation”. Maybe you can clarify that part.