Предупреждение C26820
Это потенциально дорогостоящая операция копирования. Рекомендуется использовать ссылку, если копия не требуется (p.9)
Дополнительные сведения см. в статье P.9. Не тратьте время или пространство в основных рекомендациях по C++.
Эта проверка охватывает необобязательное и простое поведение при назначении ссылки на переменную, помеченнуюauto
. Тип переменной auto
разрешается в значение, а не ссылку, а неявную копию.
Замечания
Это предупреждение не вызывается для скалярных, смарт-указателей или представлений. Он также не вызывается для типов, размер которых не превышает два раза больше размера указателя, зависящей от платформы.
Это предупреждение не возникает, когда переменная мутирует, так как помечает, что она
auto&
введет побочные эффекты в мутацию.Это предупреждение не возникает, когда ссылка поступает из временного объекта, так как это приводит к дальней ссылке. Например:
std::optional<int> TryGetNumber(); ... const auto& val = TryGetNumber().value(); val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
Пример
В этом примере показано определение переменной, которое делает потенциально дорогой копию при назначении ссылки:
const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)
Чтобы устранить эту проблему, объявите переменную, используя const auto&
следующую команду:
const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по