Подтвердить что ты не робот

Предупреждать, если доступ к перемещенному объекту в С++ 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, я бы ожидал, что у компилятора будет больше параметров (но только если это движение разрушительно).

4b9b3361

Ответ 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 в известное состояние.