Не изменяйте стандартные пространства имен

Не добавляйте и не меняйте сущности в стандартных пространствах имен std и posix (и в любых вложенных пространствах), за исключением специализации шаблонов, зависящих от пользовательских типов.

Неправильно:

namespace std {  
void my_helper(int x) { /*...*/ }  
}

Правильно:

namespace mylib {  
    void my_helper(int x) { /*...*/ }  
}

Исключения:

#include <unordered_set>

struct Point {
    int x, y;
    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
};

// Специализация std::hash для СВОЕГО типа Point
namespace std {
    template <>
    struct hash<Point> {
        size_t operator()(const Point& p) const {
            return std::hash<int>{}(p.x) ^ (std::hash<int>{}(p.y) << 1);
        }
    };
}

int main() {
    std::unordered_set<Point> points;
    return 0;
}

Здесь хэш-функция нужна, чтобы unordered_set<Point> мог быстро находить, добавлять и сравнивать объекты Point по ключу. Для этого контейнеру недостаточно одного operator==: ему еще нужен способ получить число, по которому объект будет распределен по “корзинам” внутри хэш-таблицы.

Еще пример:

template<>
struct std::default_delete<xmlChar>
{
    void operator()(xmlChar* pChar) const noexcept
    {
        xmlFree(pChar);
    }
};

using CharPtr = std::unique_ptr<xmlChar>;

Это специализация шаблона удалителя для std::unique_ptr<xmlChar>.