警告 C26445
請勿將 或
std::string_view
指派gsl::span
給參考。 建構成本低廉,而且不是基礎資料的擁有者。 (gsl.view)
或 std::string_view
的參考 gsl::span
可能是存留期問題的指示。
C++ Core Guidelines
此規則會攔截從標準容器移轉至新範圍和檢視類型的程式碼中可能發生的細微存留期問題。 這類類型可以視為「緩衝區的參考」。使用範圍或檢視的參考會建立額外的間接存取層。 這類間接存取通常是不必要的,而且可能會對維護人員造成混淆。 範圍很便宜,可以透過函式呼叫的值傳回。 顯然,不應該參考這類呼叫結果。
備註
- 此規則會偵測對 gsl::span <> 、gsl::basic_string_span 和 std::basic_string_view <> <> 的參考(包括具現化的別名)。
- 目前只會在宣告和 return 語句上發出警告。 此規則未來可能會擴充為旗標函式參數。
- 此規則的實作是輕量型,不會嘗試追蹤實際存留期。 在某些情況下,使用參考可能仍然有意義。 在這種情況下,可以安全地隱藏誤判。
程式碼分析名稱: NO_SPAN_REF
範例
暫存的參考:
// Old API - uses string reference to avoid data copy.
const std::string& get_working_directory() noexcept;
// New API - after migration to C++17 it uses string view.
std::string_view get_working_directory() noexcept;
// ...
// Client code which places an explicit reference in a declaration with auto specifier.
const auto &wd = get_working_directory(); // C26445 after API update.