From: "Fernando Cacciola" <[EMAIL PROTECTED]>
> From: "Peter Dimov" <[EMAIL PROTECTED]>
> > True, swap()'s guarantees depend on the type. If T provides a
> > nothrow/strong/basic swap, optional<T>::swap should be at least
> > nothrow/strong/basic, respectively. I think that this can be done
provided
> > that T(T const &) is strong and T::~T is nothrow.
> >
> I still have to tink about this ...

This is how it works in my mind:

if(both uninitialized)
{
// do nothing, nothrow
}
else if(one initialized, one not)
{
    lhs.reset(*rhs); // strong
    rhs.reset(); // nothrow
}
else // both initialized
{
    using std::swap;
    swap(*lhs, *rhs);
}

It doesn't even need friendship.

[...]

> optional<> is not intended to replace _all_ situations were optional
values
> are used.
> It is itended to be used on those situations were pointers are difficult
to
> use;
> but I expect programmers to keep using pointers were appropriate.
> For example, as I said before, optional arguments to a function should not
> be coded
> with optional<> but with conventional pointers.

Actually (just a minor observation)

void f(optional<T> /*const &*/ opt);

is different than

void f(T const * pt);

as the latter might potentially store 'pt' while the former cannot.

> Therefore, the shortcut which is gained by having (o1==o2) compare values,
> handling
> uninitialized cases, is in itself very useful, but gives optional<> a
> peculiarity
> which spoils its ubiquity.

Not necessarily. Please read my explanation of equivalence in the other
post, and note that it applies to pointers, too.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to