кусок кода:
auto inner = doc.createElement("inner");
doc.setRootElement(elem);
elem.appendChild(std::move(inner));
inner.getName();
void appendChild(Element&&);
Я ожидал, что компилятор меня отшлепает, когда я буду обращаться к перенесенной переменной, почему он это не делает? Или это только Rust так умеет
Как определены конструкторы/операторы мува у inner?
class Element { public: Element(); Element(xmlNodePtr node, bool owns); Element(Element&&); ~Element();
С какой стати, переменная находится в корректном состоянии
Ну вообще явно вроде переместил в метод, дальше по идее она невалидна.
Она валидна до вызова деструктора. Если автор класса все сделал правильно
ну ясно, как в Rust не получится, надо следить, чтобы её не использовать после std::move 🤷♂️
После мува наверное можно разрешить только реюзать сторадж объекта, который сейчас в moved-from-state. Остальные операции, кроме вызова деструктора - unspecified
Есть гарантия, что, например, std::string после мува - дефолтно сконсруированная строка? На сколько мне известно - нет
Не выдумывай фич языка которых не существует. Для этого есть Бьёрнэ Стровстрап
После перемещения данных из переменной переменная остаётся живой и здоровый и в корректном состоянии, поэтому это твоя ответственность чтобы при обращении к ней не совершалось каких-либо ошибок
Обсуждают сегодня