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