google-explicit-constructor

检查是否将可使用单个参数调用的构造函数和转换运算符标记为显式,以避免意外的隐式转换。

考虑以下示例

struct S {
  int x;
  operator bool() const { return true; }
};

bool f() {
  S a{1};
  S b{2};
  return a == b;
}

该函数将返回 true,因为对象在比较之前被隐式转换为 bool,这可能不是预期结果。

检查将建议在构造函数或转换运算符声明之前插入 explicit。但是,复制和移动构造函数不应该显式,以及接受单个 initializer_list 参数的构造函数。

此代码

struct S {
  S(int a);
  explicit S(const S&);
  operator bool() const;
  ...

将变成

struct S {
  explicit S(int a);
  S(const S&);
  explicit operator bool() const;
  ...

参见 https://google.github.io/styleguide/cppguide.html#Explicit_Constructors