cert-dcl58-cpp

修改 stdposix 命名空间会导致未定义的行为。此检查会针对此类修改发出警告。允许扩展 std (或 posix) 命名空间,方法是使用 (类或函数) 模板特化,这些特化依赖于用户定义的类型 (在标准系统头文件中未定义的类型)。

此检查会检测 stdposix 命名空间中的以下 (用户提供的) 声明

示例

namespace std {
  int x; // warning: modification of 'std' namespace can result in undefined behavior [cert-dcl58-cpp]
}

namespace posix::a { // warning: modification of 'posix' namespace can result in undefined behavior
}

template <>
struct ::std::hash<long> { // warning: modification of 'std' namespace can result in undefined behavior
  unsigned long operator()(const long &K) const {
    return K;
  }
};

struct MyData { long data; };

template <>
struct ::std::hash<MyData> { // no warning: specialization with user-defined type
  unsigned long operator()(const MyData &K) const {
    return K.data;
  }
};

namespace std {
  template <>
  void swap<bool>(bool &a, bool &b); // warning: modification of 'std' namespace can result in undefined behavior

  template <>
  bool less<void>::operator()<MyData &&, MyData &&>(MyData &&, MyData &&) const { // warning: modification of 'std' namespace can result in undefined behavior
    return true;
  }
}

此检查对应于 CERT C++ 编码标准规则 DCL58-CPP。不要修改标准命名空间.