继承后重新获得了移动可构造性

时间:2018-10-31 08:47:08

标签: 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_move_constructible <daughter> :: value << std :: endl;
}

我整个上午都在盯着它,但是我不知道为什么会输出:

1

base显然不可移动(is_move_constructible实际上是false上的base),并且daughter继承自它。为什么要神奇地使它再次变得可构造? daughter的默认move构造函数会是什么样?

1 个答案:

答案 0 :(得分:4)

  

类库显然不可移动

但是是。该类型特征仅检查daughter d2( std::move(d1) );对于任何两个对象是否格式正确。您可能已在base中明确删除了移动指针,但在daughter中仅隐式删除了该指针。因此,重载解决方案将正确选择副本c'tor。

  

[over.match.funcs]

     

8默认的移动构造函数或赋值运算符   ([class.copy])被定义为已删除()   各种情况下的候选函数。

如果您真的希望daughter不可移动,则需要显式删除daughter本身的move构造函数。然后,重载解决方案将命中显式删除的函数,这将使结构检查不正确。