警告 C26445
参照に
gsl::span
またはstd::string_view
を割り当てないでください。 これらは構築が安価であり、基になるデータの所有者ではありません。 (gsl.view)
gsl::span
または std::string_view
への参照は、有効期間の問題を示している可能性があります。
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.