为什么从不可移动类派生的类本身是可移动构造的?

问题描述

根据 cppreference,从不可移动的类派生也应该使派生类不可移动。那为什么派生类的std::is_move_constructible_v会返回true?

class NonMovable{
    public:
        NonMovable(const NonMovable&) = default;
        NonMovable(NonMovable&&) = delete;
        
        NonMovable& operator = (const NonMovable&) = default;
        NonMovable& operator = (NonMovable&&) = delete;
        
        NonMovable() = default;
};

class Derived : public NonMovable{};

int main(){
    std::cout << std::is_move_constructible_v<NonMovable> << "\n"; // 0
    std::cout << std::is_move_constructible_v<Derived> << "\n"; // 1
}

解决方法

key 子句如下:

复制/移动构造函数 [class.copy.ctor]

...

定义为已删除的默认移动构造函数被忽略 重载决议。 [注意:删除的移动构造函数会 否则会干扰来自可以使用的右值 的初始化 取而代之的是复制构造函数。 — 尾注 ]

强调我的。删除的移动构造函数只是从重载解析中排除,派生类的构造函数最终选择了基类的复制构造函数而不是移动构造函数。