Partilhar via


Aviso C26820

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

Observações

Para obter mais informações, consulte P.9: Não perca tempo ou espaço nas diretrizes principais do C++.

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

  • Esse aviso não é gerado para escalares, ponteiros inteligentes ou visualizações. Também não é aumentado para tipos cujo tamanho não é mais do que o dobro do tamanho do ponteiro dependente da plataforma.

  • Este aviso não é emitido quando a variável sofre mutação, pois marcá-la auto& introduziria efeitos colaterais à mutação.

  • Esse aviso não é gerado quando a referência vem de um objeto temporário, porque isso resulta 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 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