Boost logo

Boost :

From: Simon Buchan (simon_at_[hidden])
Date: 2005-10-19 01:58:56


Fernando Cacciola wrote:
> Hamish Mackenzie wrote:
>
>>On Mon, 2005-10-17 at 16:09 -0300, Fernando Cacciola wrote:
>>
>>>But that's not because optional<> is a pointer, is becasue both
>>>optional<> and pointer's are somehing else: OptionalPointees.
>>
>>Let me say first I don't use optional references (yet anyway) and I am
>>quite happy with your explanation of the need to rebind on assignment.
>>
>
> Good.
>
>
>>I am, however, still not convinced that OptionalPointees is
>>justification for using the interface of a pointer.
>
>
> OK
>
>
>>I still sometimes
>>think of optional as a vector with a maximum size of one, but I now
>>think it would be a bad idea to copy member names from std::vector, as
>>it is likely to cause confusion when using optional< vector< T > >.
>>For
>>the same reason I think optional< bool > is very problematic with the
>>current interface (see my earlier post in this thread).
>
>
> The problems with optional<bool> are totally unrelated to the choice of
> operators * and ->.
> It is the safe_bool() operator _alone_ which causes that.
> We can of course discuss whether such operator is worth it given the
> ambiguity it creates with optional<bool>. That was discussed at length at
> the time optional<> was reviewed (with me initially opposing safe_bool()),
> in the end, we agreed that it had more benefits than this simple
> counter-example.
>
>
>>Could the unifying concept OptionalPointee be implemented as free
>>functions?
>
>
> Of course.
>
> Notice that there are alternatives for safe_bool() that doesn't require
> dropping * and ->.
> These alternatives fix the problem with optional<bool>.
> One example is to simply provide operator !, used like this:
>
> if ( !!opt )
> is_initialized();
>
> (this is what my initial boost submission did)
>
wouldn't requiring nil/none comparison make more sense?
        optional<bool> opt = ...;
        if(opt != none)
        { // is initialized
                if(opt)
                { // is true
                        ...;
                }
                if(!opt)
                { // is false
                        ...;
                }
        }
        if(opt == none)
        { // isn't initialized
        }

Would the single conversion rule apply to:
        optional<char> oc = next_char();
        if(oc == none)
                // input failed!
                recover();
        if(oc) // optional<char> -> char -> bool ?
                // not the end of input
                print(oc);


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