擴充套件 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;
    };
}