Предупреждать, если доступ к перемещенному объекту в С++ 11
Возможный дубликат:
Что мне делать с перемещенным объектом?
После того, как вы вызвали std::move
и передали результат функции, вам обычно нужно предположить, что доступ к перемещенному объекту позже приведет к поведению undefined.
Существуют ли инструменты, которые могут обнаруживать эти обращения и предупреждать вас. Например:
{
Widget w;
foo(std::move(w));
// w may be undefined at this point
w.doSomething(); // WARN
}
По крайней мере, gcc 4.7.2
и clang 3.2
с -Wall
не жалуются.
Обновление: Оглядываясь на этот вопрос, критическая точка заключается в том, что компилятор не может решить, остается ли объект действительным после его перемещения. Если было принято предложение N4034: Destructive Move, я бы ожидал, что у компилятора будет больше параметров (но только если это движение разрушительно).
Ответы
Ответ 1
И не должны они. Поведение перемещенного класса - это то, что вы хотите. Это не то, о чем должен предупреждать компилятор.
Для стандартных объектов библиотеки перемещенный класс находится в "действительном, но undefined состоянии". Таким образом, это совершенно законно:
std::vector<int> v{20, 30, 40};
std::vector<int> v2 = std::move(v);
v = std::vector<int>{50, 60, 70, 80};
clear
не волнует, что такое текущее состояние вектора; он просто очищает вектор. Таким образом, оно reset к известному состоянию. Точно так же operator=
не волнует, что такое текущее состояние; он будет reset в известное состояние.