添加移动构造函数是否会破坏二进制兼容性?

cdu*_*001 10 c++ move binary-compatibility c++11

如果我将移动构造函数(或移动赋值运算符)添加到我的库中,我是否会破坏二进制兼容性?这种添加能否以任何方式破坏用户的代码?

class Foo {
public:
  Foo();
  Foo(Foo const&);
  Foo& operator=(Foo const&);

// new methods:
  Foo(Foo&&);
  Foo& operator=(Foo&&);
};
Run Code Online (Sandbox Code Playgroud)

Mot*_*tti 1

在我看来,只要不添加成员或虚拟函数,就不会对二进制兼容性产生任何影响,因为对象的布局不会改变。

如果一个组件(例如.dllWindows 或.soLinux 上的共享库)使用旧版本的库,那么它将复制该对象的所有实例(甚至右值),无论它是否是由使用新库的组件创建的(并且反之亦然)。

只要使用移动语义来提高性能,并且因此生成的移动对象的行为与复制的对象相同,就不会有问题。唯一的区别是由于对内存[解除]分配和复制等的调用减少而导致性能提高。如果移动操作用于产生不同的语义(移动的对象与复制的对象不同),那么所有的赌注都会被取消,但我认为没有人会故意这样做(也许除了工作安全)。

只要对象的二进制布局不改变,我就看不出如何引入任何破坏。