Корректная реализация семантики перемещения в классе, которая фактически наследуется от класса с нетривиальным оператором присваивания перемещения - PullRequest
3 голосов
/ 11 апреля 2020

Следующая иерархия классов вызовет предупреждение [-Wvirtual-move-assign] в G CC, если присвоение перемещения вызывается для экземпляра B.

struct A {

    std::vector<int> v; // I believe this can be a variable of any class
                        // that implements a move assignment.

};

struct B : public virtual A {};

Несмотря на предупреждение, в эта конкретная иерархия классов вначале не представляет опасности, поскольку A недоступна по нескольким путям, но кто-то может наследовать от B и некоторый другой класс C, который наследуется практически от A, и возникает проблема. Итак, давайте предположим, что мы хотим исправить проблему правильно в случае, если это произойдет.

Согласно этому вопросу , правильный способ решить эту проблему - реализовать оператор присваивания перемещения для B, который может обнаружить, что виртуальный базовый класс A находится в состоянии «удален», и пропустить второе движение, однако это не дает пример того, как это будет сделано правильно. Пожалуйста, приведите пример реализации присваивания перемещений для класса B., который правильно обрабатывает повторяющиеся перемещения.

Должен ли также быть реализован конструктор перемещения, чтобы избежать дублирования перемещений, или конструктор перемещения по умолчанию не страдает от той же проблемы? Просьба также привести пример, если это применимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...