请考虑以下代码段:
#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;
}
我整个上午都在盯着它,但是我不知道为什么会输出:
1
类base
显然不可移动(is_move_constructible
实际上是false
上的base
),并且daughter
继承自它。为什么要神奇地使它再次变得可构造? daughter
的默认move构造函数会是什么样?
答案 0 :(得分:4)
类库显然不可移动
但是是。该类型特征仅检查daughter d2( std::move(d1) );
对于任何两个对象是否格式正确。您可能已在base
中明确删除了移动指针,但在daughter
中仅隐式删除了该指针。因此,重载解决方案将正确选择副本c'tor。
[over.match.funcs]
8默认的移动构造函数或赋值运算符 ([class.copy])被定义为已删除() 各种情况下的候选函数。
如果您真的希望daughter
不可移动,则需要显式删除daughter
本身的move构造函数。然后,重载解决方案将命中显式删除的函数,这将使结构检查不正确。