扩展 std 或 posix 命名空间
标准(17.6.4.2.1 / 1) 通常禁止扩展 std
名称空间:
如果 C++程序向命名空间 std 或命名空间 std 中的命名空间添加声明或定义,则它是未定义的,除非另有说明。
posix
(17.6.4.2.2 / 1)也是如此:
如果 C++程序将声明或定义添加到命名空间 posix 或命名空间 posix 中的命名空间,则该行为是未定义的,除非另有说明。
考虑以下:
#include <algorithm>
namespace std
{
int foo(){}
}
标准中没有任何内容禁止定义相同定义的 algorithm
(或其中包含的标题之一),因此此代码将违反 One Definition Rule 。
所以,一般来说,这是禁止的。但是,允许有特定的例外情况 。也许最有用的是,允许为用户定义的类型添加特化。因此,例如,假设你的代码具有
class foo
{
// Stuff
};
然后以下是好的
namespace std
{
template<>
struct hash<foo>
{
public:
size_t operator()(const foo &f) const;
};
}