cert-dcl58-cpp¶
修改 std
或 posix
命名空间会导致未定义的行为。此检查会针对此类修改发出警告。允许扩展 std
(或 posix
) 命名空间,方法是使用 (类或函数) 模板特化,这些特化依赖于用户定义的类型 (在标准系统头文件中未定义的类型)。
此检查会检测 std
或 posix
命名空间中的以下 (用户提供的) 声明
任何非模板特化。
任何标准库函数模板或类模板的显式特化,前提是它不具有任何用户定义的类型作为模板参数。
标准库类模板中任何成员函数的显式特化。
标准库类或类模板中任何成员函数模板的显式特化。
标准库类或类模板中任何成员类模板的显式或部分特化。
示例
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。不要修改标准命名空间.