Warning C26820
This is a potentially expensive copy operation. Consider using a reference unless a copy is required (p.9)
For more information, see P.9: Don't waste time or space in the C++ Core Guidelines.
This check covers nonobvious and easy-to-miss behavior when assigning a reference to a variable marked auto
. The type of the auto
variable is resolved to a value rather than a reference, and an implicit copy is made.
Remarks
This warning isn't raised for scalars, smart pointers, or views. It's also not raised for types whose size isn't more than twice the platform-dependent pointer size.
This warning isn't raised when the variable gets mutated, as marking it
auto&
would introduce side-effects to the mutation.This warning isn't raised when the reference comes from a temporary object, because that results in a dangling reference. For example:
std::optional<int> TryGetNumber(); ... const auto& val = TryGetNumber().value(); val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
Example
This sample shows a variable definition that makes a potentially expensive copy when assigned a reference:
const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)
To resolve this issue, declare the variable by using const auto&
instead:
const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK