纯虚函数是否会阻止隐式生成的移动构造函数?

时间:2015-04-22 21:46:55

标签: c++ c++11 language-lawyer move-semantics

#include <type_traits>

struct test {
    virtual void foo() noexcept = 0;
};

struct test2 : test {
    void foo() noexcept override final {}   
};

// fails
static_assert(std::is_move_constructible<test>::value, "test not move constructible");
// succeeds
static_assert(std::is_move_constructible<test2>::value, "test2 not move constructible");

(Live)
根据{{​​3}}(据我所知),test应该有一个隐式生成的移动构造函数:

  

T类的隐式声明或默认移动构造函数定义为 deleted ,其中任何一种情况都属实:

     
      
  • T [= test]具有无法移动的非静态数据成员(已删除,不可访问或不明确的移动构造函数)
  •   
  • T具有无法移动的直接或虚拟基类(已删除,不可访问或模糊的移动构造函数)
  •   
  • T具有带有已删除或无法访问的析构函数的直接或虚拟基类
  •   
  • T是一个联合,并且具有带有非平凡复制构造函数的变体成员
  •   
  • (直到C ++ 14)T有一个非静态数据成员或一个没有移动构造函数的直接或虚拟基础,而这种移动构造函数不是可以轻易复制的。
  •   

为什么编译器不为test生成隐式移动构造函数?为什么test2会这样做?

1 个答案:

答案 0 :(得分:14)

std::is_move_constructible检查是否可以从rvalue参数构造类型。 test是一个抽象类类型。无论论证如何,它都无法构建。