Повторно приобретенный ход-конструктивность после наследования - PullRequest
0 голосов
/ 31 октября 2018

Рассмотрим следующий фрагмент:

#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?

1 Ответ

0 голосов
/ 31 октября 2018

База классов явно не перемещается, конструктивна

Но это так. Эта черта типа просто проверяет, что daughter d2( std::move(d1) ); правильно сформирован для любых двух объектов. Возможно, вы явно удалили ctor-ход в base, но в daughter он удален только неявно. Таким образом, разрешение перегрузки будет правильно выбирать копию c'tor.

[over.match.funcs]

8 Конструктор перемещения по умолчанию или оператор присваивания ([class.copy]), который определен как удаленный, исключается из набора функции-кандидаты во всех контекстах.

Если вы действительно хотите, чтобы daughter не были movalbe, вам нужно явно удалить конструктор перемещения самого daughter. Тогда разрешение перегрузки попадет на явно удаленную функцию, которая сделает проверяемую конструкцию некорректной.

...