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