微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

根据 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]

...

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。