|
Boost : |
Subject: Re: [boost] variant2 never empty guarantees (was: Re: Outcome/expected/etc/etc/etc)
From: Peter Dimov (lists_at_[hidden])
Date: 2017-06-14 16:06:18
Andrzej Krzemienski wrote:
> > This does not mean that all assignments are strong. In
> >
> > variant<vector<string>> v1, v2;
> >
> > v1 = v2;
> >
> > the assignment is basic, because that's the guarantee
> > vector<string>::operator= gives.
>
>
> Interesting. This satisfies the expectation that a number of people have
> expressed.
Exactly. For me basic is basic, regardless of whether the type stays the
same, but apparently this does not match people's intuitive expectations.
> But on the other hand, now that you are doing the double buffering
> anyway, making the assignment strong would come almost fo free.
Not free here because the above variant doesn't double-buffer (because all
alternatives are nothrow move constructible).
> If we continue the example with projections: if I change from the drop
> down menu from one mesh projection to another mesh projection, they are
> different projections, but can be encoded in the same type; maybe we
> should get the strong guarantee. If not in the assignment, then perhaps in
> a dedicated function.
You get the strong guarantee here in move assignment (because vector's move
assignment doesn't throw (... except for unequal allocators ...)):
v1 = std::move(v2); // strong
v1 = variant<vector<string>>(v2); // strong
v1 = vector<string>{ "s1", "s2" }; // strong
and in emplace, because it doesn't use assignment:
v1.emplace<vector<string>>( ... ); // strong too
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk