Advertencia C26820

Se trata de una operación de copia potencialmente costosa. Considere la posibilidad de usar una referencia a menos que se requiera una copia (p.9)

Para más información, consulte P.9: No malgastar espacio o tiempo en C++ Core Guidelines.

Esta comprobación cubre el comportamiento noobvioso y fácil de perder al asignar una referencia a una variable marcada como auto. El tipo de la variable auto se resuelve en un valor en lugar de en una referencia y se realiza una copia implícita.

Comentarios

  • Esta advertencia no se genera para escalares, punteros inteligentes o vistas. Tampoco se genera para los tipos cuyo tamaño no es superior al doble del tamaño del puntero dependiente de la plataforma.

  • Esta advertencia no se genera cuando la variable se muta, ya que al marcarla como auto& se introducirían efectos secundarios en la mutación.

  • Esta advertencia no se genera cuando la referencia procede de un objeto temporal, porque da lugar a una referencia pendiente. Por ejemplo:

    std::optional<int> TryGetNumber();
    ...
    const auto& val = TryGetNumber().value();
    val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
    

Ejemplo

En este ejemplo se muestra una definición de variable que hace una copia potencialmente costosa cuando se le asigna una referencia:

const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)

Para resolver este problema, declare mejor la variable mediante const auto&:

const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK