"David Abrahams" <[EMAIL PROTECTED]> wrote in message [EMAIL PROTECTED]">news:[EMAIL PROTECTED]... > "Fernando Cacciola" <[EMAIL PROTECTED]> writes: > > > "David Abrahams" <[EMAIL PROTECTED]> wrote in message > > [EMAIL PROTECTED]">news:[EMAIL PROTECTED]... > >> "Fernando Cacciola" <[EMAIL PROTECTED]> writes: > >> > >> > Any idea about what to do with reference to reference problem? > >> > >> What's the problem? > >> > > Currently, optional<Y> has: > > > > explicit optional ( T const& val ) > > T* get(); > > T* operator->() ; > > T& operator *(); > > > > those are all illegal if T is a reference type. > > explicit optional ( typename add_reference<typename add_const<T>::type>::type val ) > typename add_pointer<typename remove_reference<T>::type>::type get(); > typename add_pointer<typename remove_reference<T>::type>::type operator->() ; > typename add_reference<T>::type operator *(); > I see. Correct me if I'm wrong:
You're essentially saying that, for instance, optional<> is initialized with a "value of type T"; and that whether that is expressed with 'T' or 'T const&' is an implementation detail. It implies that the user should not assume that the initializer is not taken by-value. Similarly, operator*() returns 'the value', being an implementation detail whether this is 'T' or 'T const&'. Well, this sounds good by itslef. Still, there are other problems with optional<T&>: AFAICT, one way or another, the 'value' that optional holds, in this case of reference type, must be stored in the aligned storage. But you can't get a pointer to a reference so you can't have somehing like: new (storage) U(value) ; where U=T& IOWs, you can't have a real 'copy' of a reference with storage and all (if you could, you could also have a pointer/reference to it). References are not required to be actual objects, they don't need to be stored anywhere. You can have a pointer to the referenced object, but then, the optional<T&> would not be an 'optional reference' object but a reference to an 'optional object', so we're back to argument that in this case you can use a pointer instead of optional<>. ... Now that I think about it, optional<T&> doesn't make sense because T& is not a object, and optional<U> represent an optional U object. References are not objects. IOWs, that you have or don't have a 'U' means that if you have an U you have it stored somewhere. > >> > > >> > What was the idea of: optional< exactly<T&> > ? > >> > >> It's an ambiguity breaker: a way of specifying, when constructed with > >> a variant<T,T&>, that you want to get the T& and not the T. > >> > > hmmm, shouldn't 'exactly' appear along with extract then? > > What's the meaning of "optional< exactly<T&> > " by itself, without > > variant<T,T&> in the scene? > > I dunno, maybe nothing; we were talking about optional as a > replacement for extract. > Aha, OK. -- Fernando Cacciola _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost