У меня есть код, который перемещает объект в другой объект. Мне больше не понадобится исходный, перемещенный объект на верхнем уровне. Таким образом, движение - правильный выбор, я думаю.Есть ли способ сделать перемещенный объект «недействительным»?
Однако, думая о безопасности, я задаюсь вопросом, есть ли способ сделать недействительным перемещенный объект и тем самым предотвратить неопределенное поведение, если кто-то обратится к нему.
Here хороший пример:
// move example
#include <utility> // std::move
#include <vector> // std::vector
#include <string> // std::string
int main() {
std::string foo = "foo-string";
std::string bar = "bar-string";
std::vector<std::string> myvector;
myvector.push_back (foo); // copies
myvector.push_back (std::move(bar)); // moves
return 0;
}
Описание говорит:
Первый вызов
myvector.push_back
копирует значениеfoo
в вектор (foo
сохраняет значение, которое было до того, как вызов). Второй вызов перемещает значениеbar
в вектор. Это переносит его содержимое в вектор (в то время какbar
теряет свое значение и теперь находится в действительном, но неуказанном состоянии).
Есть ли способ аннулировать bar
, так что доступ к нему приведет к ошибке компилятора? Что-то вроде:
myvector.push_back (std::move(bar)); // moves
invalidate(bar); //something like bar.end() will then result in a compiler error
Edit: А если нет такой вещи, почему?
Да, конечно, если вы все еще хотите использовать эту инициализированную память, вы в порядке. Однако вопрос касается случая, когда я больше не хочу его использовать, и на самом деле я бы хотел сделать его полностью недействительным. – dani