Предупреждение 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