경고 C26820

이는 잠재적으로 비용이 많이 드는 복사 작업입니다. 복사본이 필요하지 않은 경우 참조를 사용하는 것이 좋습니다(p.9)

자세한 내용은 P.9: C++ 핵심 지침에서 시간 또는 공간을 낭비하지 마세요.

이 검사 표시된 auto변수에 대한 참조를 할당할 때 눈에 띄지 않고 놓치기 쉬운 동작을 다룹니다. 변수의 auto 형식은 참조가 아닌 값으로 확인되고 암시적 복사본이 만들어집니다.

설명

  • 스칼라, 스마트 포인터 또는 뷰에는 이 경고가 발생하지 않습니다. 또한 크기가 플랫폼 종속 포인터 크기의 두 배 이하인 형식에 대해서도 발생하지 않습니다.

  • 이 경고는 변수가 변경될 때 발생하지 않습니다. 표시하면 auto& 돌연변이에 부작용이 발생하므로 발생합니다.

  • 이 경고는 임시 개체에서 참조를 가져올 때 발생하지 않습니다. 그 결과 참조가 매달려 있기 때문입니다. 예시:

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

예시

이 샘플에서는 참조가 할당될 때 잠재적으로 비용이 많이 드는 복사본을 만드는 변수 정의를 보여 줍니다.

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

이 문제를 해결하려면 다음을 대신 사용하여 const auto& 변수를 선언합니다.

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