2014-04-14 10:34 GMT+02:00 Antony Polukhin
2014-04-14 10:16 GMT+04:00 Adam Romanek
: 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.htm... "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-td...
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 [1] http://boost.2283326.n4.nabble.com/move-interest-the-pass-by-value-and-swap-...