Aviso C26820

Esta é uma operação de cópia potencialmente cara. Considere o uso de uma referência, a menos que uma cópia seja necessária (p.9)

Para obter mais informações, confira P.9: não perca tempo nem espaço nas Diretrizes Principais do C++.

Essa verificação abrange o comportamento não óbvio e fácil de perder ao atribuir uma referência a uma variável marcada auto. O tipo da variável auto é resolvido em um valor em vez de uma referência, e uma cópia implícita é feita.

Comentários

  • Este aviso não é gerado para escalares, ponteiros inteligentes nem exibições. Ele também não é gerado em tipos cujo tamanho não seja mais do que o dobro do tamanho do ponteiro dependente da plataforma.

  • Esse aviso não é gerado quando ocorre mutação da variável, pois a marcá-la como auto& introduziria efeitos colaterais à mutação.

  • Esse aviso não é gerado quando a referência vem de um objeto temporário, pois isso resultaria em uma referência pendente. Por exemplo:

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

Exemplo

Este exemplo mostra uma definição de variável que faz uma cópia potencialmente cara quando atribuída a uma referência:

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

Para resolver esse problema, declare a variável usando const auto&:

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