基类析构函数是否阻止生成移动构造函数

时间:2016-01-15 11:57:31

标签: c++ visual-studio-2015

我有一个类,其中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,但是哪个编译器版本就在这里?

1 个答案:

答案 0 :(得分:2)

VS 2015 Update 1正在做正确的事(实际上是第一个实现所有C ++ 11的VS版本)

来自标准:

  

§12.8复制和移动类对象

     

如果类X的定义没有明确声明移动   构造函数,只有当一个隐式声明为默认值   如果

     
      
  • X没有用户声明的复制构造函数,
  •   
  • X没有用户声明的复制赋值运算符
  •   
  • X没有用户声明的移动赋值运算符
  •   
  • X没有用户声明的析构函数,
  •   
  • 移动构造函数不会被隐式定义为已删除。
  •   

Shared中用户生成的析构函数隐式将移动构造函数标记为已删除。当您让编译器生成它时,编译器也可以生成移动赋值运算符。

struct Shared
{
   virtual ~Shared() = default;
}

出于性能原因,以这种方式声明空的虚拟析构函数也更好,因为它保证了编译器的内联。