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