>
>
>
V738. Temporary anonymous object is use…


V738. Temporary anonymous object is used.

Анализатор обнаружил, что используется временный анонимный объект, получившийся в результате работы постфиксного оператора ++ или --. Иногда это имеет смысл. Но когда речь заходит о изменении этого временного объекта или взятии его адреса, то это ошибка.

Рассмотрим первый пример:

vector<float>::iterator it = foo();
it++ = x;

Создаётся временная копия итератора. Итератор инкрементируется. После чего к временному объекту применяется оператор присваивания. Этот код не имеет смысла. Автор кода хотел явно сделать что-то другое. Например, он хотел в начале выполнить присваивание, а уже затем воспользоваться инкрементом.

В этом случае корректный код должен выглядеть так:

it = x;
it++;

Однако постфиксная операция для итераторов не эффективна. И будет лучше написать так:

it = x;
++it;

Есть ещё один вариант:

it = x + 1;

Рассмотрим второй пример:

const vector<int>::iterator *itp = &it++;

Указатель 'itp' использовать нельзя. Он указывает на временный неименованный объект, который уже разрушен. Корректный вариант кода:

++it;
const vector<int>::iterator *itp = &it;

Данная диагностика классифицируется как: