Boost logo

Boost :

Subject: Re: [boost] variant2 never empty guarantees (was: Re: Outcome/expected/etc/etc/etc)
From: Gottlob Frege (gottlobfrege_at_[hidden])
Date: 2017-06-12 19:00:59


On Mon, Jun 12, 2017 at 1:29 PM, Peter Dimov via Boost
<boost_at_[hidden]> wrote:
> Gottlob Frege wrote:
>>
>> On Wed, Jun 7, 2017 at 10:28 AM, Peter Dimov via Boost
>> <boost_at_[hidden]> wrote:
>> > Gottlob Frege wrote:
>> >
>> >> Agreed. But I don't see much value in the never-empty guarantee if it
>> >> >> doesn't give you the strong guarantee.
>> >
>> >
>> > I'm not sure I understand this fully; could you please explain from what
>> > > expressions, and under what conditions, you expect the strong guarantee?
>> >
>> > variant<X, Y> v1, v2;
>> > X x;
>> >
>> > v1= v2; // do you expect strong guarantee here?
>> > v1 = std::move(v2); // here?
>> > v1 = x; // here?
>> > v1 = std::move(x); // here?
>> > v1.emplace<X>(); // here?
>>
>>
>> How about "all of the above"?
>> At least when X and Y each offer the strong guarantee?
>
>
> I'm interested in a practical answer, not a theoretically sound one which is
> of no use. Suppose that X is something that occurs in practice, such as
> std::vector, not some hypothetical X with a strong assignment, which
> doesn't.
>
> Unless of course you only put types with strong assignment operators into
> your variants, which in practice confines you to built-ins, in which case
> all of the above will indeed be not just strong, but nonthrowing as well.
>

I think I'm going with Niall's comment some time earlier - to have
variant give as strong a guarantee as the types it holds. If X = X
(assignment) is only basic, I don't really need variant to somehow
magically make variant<X> = variant<X> strong.

Maybe I just don't have enough time to think about this all the way
through - your comments about how strong doesn't compose, and using
the swap idiom at the correct level are interesting. Are you saying
your variant2 fixes swap, but doesn't go full strong, and that that is
all we really need?

Tony


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