
Brock Peabody wrote:
On Behalf Of Leo Goodstadt
The easiest solution to disambiguate, would be to force all binding and rebinding of optional references to use distinct syntax (rebind) so that this is clearly signalled at the minor cost of some syntactic verbosity.
Which is exactly what optional does in the way I proposed it (with rebinding) opt = value ; // always rebinds *opt = *value ; // never rebinds (but is UB if *opt refers to nothing) Notice that the code I posted and where you saw yourself the problem shows the behaviour that would existed if optional<> were not the way I designed it.
This means that optional<T&> is no longer completely orthogonal to optional<T> in its syntax, but as that merely reflects the real underlying differences in semantics, this should be an advantage not a disadvantage.
An easy way to do that would be to disallow optional<T&> and spell it instead as optional<reference_wrapper<T> > as someone suggested the last time this was discussed.
FWIW, optional<T&> has the exact same semantics of optional< reference_wrapper<T> > rebinding on assignment included. NOTE: Don't get distracted by the fact that reference_wrapper<T> istself doesn't rebind on assigment. If _that_ is stored as the value of an optional<>, then _direct_ assignment (opt=val) would always rebind and _indirect_ asssignment (*o=val), would never rebind; just as it is now with my proposed rebinding. Best -- Fernando Cacciola SciSoft http://fcacciola.50webs.com/