警告 C26820

これは、コストの高いコピー操作である可能性があります。 コピーが必要でない限り、参照の使用を検討してください (p.9)

詳細については、C++ Core Guidelines の「P.9: 時間やスペースを無駄にしない」を参照してください。

このチェックでは、マークされたauto変数への参照を割り当てるときに、目立たない、見逃しやすい動作について説明します。 auto 変数の型は参照ではなく値に解決され、暗黙的なコピーが作成されます。

解説

  • この警告は、スカラー、スマート ポインター、またはビューでは発生しません。 また、サイズがプラットフォームに依存するポインター サイズの 2 倍以下の型に対して発生することもありません。

  • この警告は、変数が変更された場合には発生しません。これを 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