Перенаправленный объект может быть неожиданно изменен
Этот дефект возникает, когда:
Вы используете std:move переадресация ссылки на функцию, включая объекты типа auto &&.
Вы используете std:forward чтобы переслать ссылку rvalue на функцию.
Можно эффективно передать объект в функцию, приведя объект в rvalue и воспользовавшись семантикой перемещения.
Polyspace® не помечает использование std:move или std:forward если переадресация на функцию не выполняется. Например, в этом фрагменте кода не возникает дефекта при использовании std:move с ссылкой на пересылку b2 и использование std:forward с ссылкой перезначения b1.
template <typename T1, typename T2>
void func(T1& b1, T2&& b2)
{
const T1& b10 = std::forward<B>(b1);
const T2& b20 = std::forward<B>(b2);
const T1& b11 = std::move(b1);
const T2& b21 = std::move(b2);
}Использование std:move с переадресацией ссылок может привести к неожиданному изменению значения lvalue. Использование std:forward с rvalue ссылки возможны, но это подвержено ошибкам и может увеличить сложность вашего кода.
Если вы пересылаете ссылку rvalue на функцию, используйте std:move чтобы привести объект к значению rvalue.
Если вы пересылаете ссылку на переадресацию (или универсальную ссылку) в функцию, используйте std:forward чтобы привести объект к значению rvalue тогда и только тогда, когда объект связан с значением rvalue. Ссылка на пересылку может быть связана с rvalue или lvalue. Объекты с типом auto && рассматриваются как ссылки на пересылку.
| Группа: Программирование |
| Язык: C++ |
| По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: INCORRECT_VALUE_FORWARDING |
| Влияние: Высокий |