我有一个类,其中VS 2015没有生成移动ctor,现在VS 2015 Update 1它正在生成一个,这导致二进制兼容性问题,不确定哪个版本正在做正确的事情。
// MyLib
struct Shared
{
virtual ~Shared(){}
}
struct Callback : public Shared
{
virtual void response() = 0;
}
// App
struct CallbackI : public Callback
{
virtual void response(){}
}
当我使用VS 2015构建MyLib和使用VS 2015更新1的App时,链接App失败,因为缺少符号引用了Callback基类的移动赋值运算符。
对我来说,VS 2015并没有生成这个运营商和VS 2015 Update 1,但是哪个编译器版本就在这里?
答案 0 :(得分:2)
VS 2015 Update 1正在做正确的事(实际上是第一个实现所有C ++ 11的VS版本)
来自标准:
§12.8复制和移动类对象
如果类X的定义没有明确声明移动 构造函数,只有当一个隐式声明为默认值 如果
- X没有用户声明的复制构造函数,
- X没有用户声明的复制赋值运算符
- X没有用户声明的移动赋值运算符
- X没有用户声明的析构函数,
- 移动构造函数不会被隐式定义为已删除。
Shared
中用户生成的析构函数隐式将移动构造函数标记为已删除。当您让编译器生成它时,编译器也可以生成移动赋值运算符。
struct Shared
{
virtual ~Shared() = default;
}
出于性能原因,以这种方式声明空的虚拟析构函数也更好,因为它保证了编译器的内联。