Пересылка значений другим функциям должна осуществляться через: (1) std:: move, если значение является ссылкой на значение rvalue, (2) std:: forward, если значение является ссылкой на пересылку
Пересылка значений другим функциям должна осуществляться через: (1) std:: move, если значение является ссылкой на значение rvalue, (2) std:: forward, если значение является ссылкой на пересылку.
Можно эффективно передать объект функции, приведя объект к значению rvalue и воспользовавшись семантикой перемещения.
При пересылке ссылки rvalue на функцию используйте std::move для приведения объекта к значению rvalue.
При пересылке ссылки на пересылку (или универсальной ссылки) в функцию используйте std::forward приведение объекта к значению rvalue тогда и только тогда, когда объект привязан к значению rvalue. Ссылка на пересылку может быть привязана к значению rvalue или lvalue. Для целей этого правила объекты с типом auto && рассматриваются как ссылки на пересылку.
Используя std::move при пересылке ссылок может привести к неожиданному изменению значения lvalue. Используя std::forward с rvalue ссылки возможны, но он подвержен ошибкам и может увеличить сложность кода.
Polyspace ® помечает использование std::move переадресация ссылки на функцию, включая объекты типа auto &&.
Polyspace помечает использование std::forward для пересылки ссылки 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);
}Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Библиотека поддержки языка |
| Категория: Обязательно, Автоматизировано |