Поделиться через


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