Boost logo

Boost :

Subject: Re: [boost] [optional] std::tr2::optional
From: Sebastian Redl (sebastian.redl_at_[hidden])
Date: 2011-11-19 05:22:25


On 19.11.2011, at 00:16, Andrzej Krzemienski wrote:

>>> * Should exception safety guarantees for assignment operations be
> enforced?
>>> In boost::optional they only provide a basic guarantee.
>>> One option is to provide strong guarantee for types T which implement
>>> operator= with strong guarantee, and give basic guarantee for other
> cases
>>> Other option (not sure if it is possible) is to provide strong
> guarantee
>>> for all cases at the cost of run-time performance (heap allocation).
>
>> Provide the same exception guaranties as the T assignment seems the more
>> reasonable.
>
> My apologies, I wrote this in a hurry an didn't make myself clear. There
> are three cases to consider (leaving move assignment and no-throw copyable
> types aside):
> 1. Our stored type T provides a strong assignment - the choice is obvious:
> optional<T>'s assignment is also strong
> 2. T has "basic" assignment - the natural choice is to provide also a basic
> guarantee for optional<T>'s assignment.
> 3. T is neither copyable nor moveable -- it is like a scope guard, or
> boost::scoped_ptr. In this case optional<T> still provides assignment by
> making a "pseudo destructor call" followed by a call to placement new. --
> but this gives only basic guarantee.
> The question is if for this third variant we should be happy with only
> basic guarantee or to use a trick boost::variant is using with auxiliary
> heap-allocated object? (I do not even know if this is applicable though).

Do we even want the third variant? That is, do we want to support tr2::optional of something that is neither copyable nor movable?
My gut instinct says no, that's unintuitive.

Sebastian


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