C++ 继承后重新获得的移动可构造性

C++ 继承后重新获得的移动可构造性,c++,inheritance,move,move-constructor,C++,Inheritance,Move,Move Constructor,考虑以下代码段: #include <iostream> #include <type_traits> class base { public: base(const base &) = default; base(base &&) = delete; }; class daughter : public base { }; int main() { std :: cout << std :: is_mo

考虑以下代码段:

#include <iostream>
#include <type_traits>

class base
{
public:

    base(const base &) = default;
    base(base &&) = delete;
};

class daughter : public base
{
};

int main()
{
    std :: cout << std :: is_move_constructible <daughter> :: value << std :: endl;
}
base
显式不可移动可构造(
是\u move\u constructible
base
上实际上是
false
),并且
子类继承自它。为什么它会神奇地再次变为移动可构造?
子元素的默认移动构造函数是什么样子的

类基类显式不可移动构造

但事实确实如此。该类型特征仅检查
子d2(std::move(d1))对于任意两个对象格式良好。您可能已经在
base
中明确删除了move c'tor,但在
children
中,它只被隐式删除。因此,重载解析将正确选择复制任务

[over.match.funcs]

默认的移动构造函数或赋值运算符 定义为已删除的([class.copy])将从 候选函数适用于所有上下文

如果确实希望
子对象
是非移动的,则需要显式删除
子对象
本身的移动构造函数。然后重载解析将命中一个显式删除的函数,这将使被检查的构造格式错误

类基类显式不可移动构造

但事实确实如此。该类型特征仅检查
子d2(std::move(d1))对于任意两个对象格式良好。您可能已经在
base
中明确删除了move c'tor,但在
children
中,它只被隐式删除。因此,重载解析将正确选择复制任务

[over.match.funcs]

默认的移动构造函数或赋值运算符 定义为已删除的([class.copy])将从 候选函数适用于所有上下文


如果确实希望
子对象
是非移动的,则需要显式删除
子对象
本身的移动构造函数。然后重载解析将命中一个显式删除的函数,这将使被检查的构造格式错误

我觉得奇怪的是
女儿(女儿&&)=默认值
将使trait为false。@user207933-我想您可能刚刚发现了一个编译器错误。我的回答中的这一段似乎意味着你添加的声明不应该影响这个特征
将使trait为false。@user207933-我想您可能刚刚发现了一个编译器错误。我的回答中的这一段似乎意味着你添加的声明不应该影响这种特质。
1