#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
会这样做?