title | description | ms.date | f1_keywords | helpviewer_keywords | ||
---|---|---|---|---|---|---|
Warning C26820 |
Reference for Microsoft C++ Code Analysis warning C26820 in Visual Studio. |
10/12/2023 |
|
|
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.
-
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
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