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