扩展 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;
    };
}