Boost logo

Boost :

From: Joel de Guzman (joel_at_[hidden])
Date: 2003-11-02 21:05:09


Hi Eric,

Agreed. Thanks for your insights. See my other post and
feel free to comment.

-- 
Joel de Guzman
http://www.boost-consulting.com
http://spirit.sf.net
Eric Friedman <ebf_at_[hidden]> wrote:
> Joel,
> 
> I have not followed the development of optional too closely, so I am
> unsure of the current assignment semantics for optional<T>, let alone
> optional<T&>. That said, comparison to variant might nonetheless be
> helpful...
> 
> Joel de Guzman wrote:
>> What I would really like to see is this parallel:
>> 
>>     int a = 4;
>>     int& r = a;
>>     r = 3; // a is now 3
>> 
>> <...>
>> 
>>     int a = 4;
>>     optional<int&> o(a);
>>     o = 3; // a is now 3
>> 
>> Treating uninitialized lhs as initialization of the reference would
>> rule out the assignment of constants and literals, right?
> 
> Well this sort of usage is explicitly disallowed with variant:
> 
>    int a = 4;
>    variant<int&> v(a);
>    v = 3; // compile error!
> 
> This is because I view variant as a "multi-type, single-value"
> container. Thus, one must instead write something like the following:
> 
>    int a = 4;
>    variant<boost::empty, int&> v(a);
>    boost::get<int&>(v) = 3;  // or use a visitor
>    assert(a == 3);
> 
> My understanding is that this would map to
> 
>    int a = 4;
>    optional<int&> o(a);
>    *o = 3;
> 
> instead of your desired syntax.
> 
> In short, if optional<T&> were to mirror variant<empty, T&>, then
> attempted use of optional<T&>::operator= should result in a compile error.

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk