警告 C26445

请勿将 gsl::spanstd::string_view 分配给引用。 它们构造成本低,不是基础数据的所有者。 (gsl.view)

引用 gsl::spanstd::string_view 可能指示生存期问题。

C++ Core Guidelines

GSL.view:视图

此规则捕获从标准容器迁移到新跨度和视图类型的代码中可能出现的细微生命周期问题。 这种类型可视为“对缓冲区的引用”。使用对范围或视图的引用可创建额外的间接层。 这种间接性通常是不必要的,并且可能会让维护者感到困惑。 跨度的复制成本很低,并且可以通过函数调用的值返回。 显然,这样的调用结果绝不应该被引用。

备注

  • 此规则检测对 gsl::span<>、gsl::basic_string_span<> 和 std::basic_string_view<> 的引用(包括实例化的别名)。
  • 目前仅对 declarations 和 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.