над объектом после перемещения?
y = std::move(x);
Почему нет?
а где прописанное требование к move ctor оставить объект в состоянии таком, что объект может использоваться в левой части операции присваивания?
Было для контейнеров стандартной библиотеки (что-то про валидное не неспецифицированное состояние)
Ну потому что в lvalue может быть что угодно в любом состоянии?
Это вроде неверно для присваивания контейнеров с разными значениями аллокаторов
У тебя в примере и не контейнер, а что-то абстрактное
Вы указываете предикат "для любого", он опровергнут контрпримером. Неверно, что левый аргумент присваивания не важен при выполнении операции - класс может иметь неперемещаемые инварианты
Это всё зависит от реализации мув операций в конкретном классе. Обычно делают как в std - valid but unspecified
А вот требовать какое-то валидное состояние это требовать неразрушающего перемещения, это слишком жесткое требование По факту для MoveCtor нужно прописать именно требование эквивалентности x = expression и auto y = std::move(x); x = expression;
Ты запретишь перемещение объектов, содержащих ненулевой unique_ptr, это равносильно неразрушающему перемещению, а в текущий момент стандарт и p1144 рассматривает перемещение скорее как разрушающее
Кстати, в стандартной библиотеке есть проблема именно из-за такого определения, у std::list не получается noexcept перемещения
Обсуждают сегодня