警告 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