|
Boost : |
Subject: Re: [boost] [variant] Why no move emulation with Boost.Move for C++03?
From: Krzysztof Czainski (1czajnik_at_[hidden])
Date: 2014-04-14 04:53:24
2014-04-14 10:34 GMT+02:00 Antony Polukhin <antoshkka_at_[hidden]>:
> 2014-04-14 10:16 GMT+04:00 Adam Romanek <romanek.adam_at_[hidden]>:
>
> > On 04/13/2014 02:59 PM, Steven Watanabe wrote:
> >
> >> Boost.Move is not completely backwards
> >> compatible. i.e. adding it to an existing
> >> class can break user code.
> >>
> >>
> > Steven, could you please elaborate on this? I mean how can it break
> > existing code? And what about backward compatibility? I haven't found
> > anything on it in the documentation. Thanks in advance.
> >
>
> Main restriction that affect portability is described here:
>
> http://www.boost.org/doc/libs/1_55_0/doc/html/move/emulation_limitations.html#move.emulation_limitations.assignment_operator(
> "Assignment
> operator in classes derived from or holding copyable and
> movable types")
>
> It is a big problem. For example this limitation broke compilation of
> Boost.ProgramOptions after move emulation was added to Boost.Any:
>
> http://boost.2283326.n4.nabble.com/any-last-commit-breaks-program-options-td4645378.html
>
> Because of that restriction Boost.Variant, Boost.Any and
> Boost.CircularBuffer do not use Boost.Move emulation everywhere. For those
> libraries some of the move functions are available only in C++11 mode.
>
I think with an assignment operator implemented in terms of the
pass-by-value and swap idiom, you get a CopyAssignamble as well as a
MoveAssignable type without this issue. I described this here [1] together
with my 'explicit copy' proposition.
HTH,
Kris
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk