bugprone-optional-value-conversion

检测可能无意且多余的转换,其中从类似可选类型的类型中提取值,然后用于创建同一类似可选类型的新的实例。

这些转换可能是开发者疏忽、代码重构遗留问题或其他可能导致意外异常或导致生成的可选类型总是初始化的情况的结果,这可能是意外行为。

为了说明,请考虑以下有问题的代码片段

#include <optional>

void print(std::optional<int>);

int main()
{
  std::optional<int> opt;
  // ...

  // Unintentional conversion from std::optional<int> to int and back to
  // std::optional<int>:
  print(opt.value());

  // ...
}

更好的方法是将 opt 直接传递给 print 函数,而无需提取其值

#include <optional>

void print(std::optional<int>);

int main()
{
  std::optional<int> opt;
  // ...

  // Proposed code: Directly pass the std::optional<int> to the print
  // function.
  print(opt);

  // ...
}

通过将 opt 直接传递给 print 函数,可以避免不必要的转换,并将潜在的意外行为或异常降至最低。

使用 operator * 的值提取默认匹配。对非标准可选类型(如 boost::optionalabsl::optional)的支持可能有限。

选项:

OptionalTypes

用分号分隔的(完全限定的)可选类型名称或与可选类型匹配的正则表达式列表。默认值为 ::std::optional;::absl::optional;::boost::optional

ValueMethods

用分号分隔的(完全限定的)方法名称或与方法匹配的正则表达式列表。默认值为 ::value$;::get$