Не изменяйте стандартные пространства имен
Не добавляйте и не меняйте сущности в стандартных пространствах имен std и posix (и в любых вложенных пространствах), за исключением специализации шаблонов, зависящих от пользовательских типов.
Неправильно:
Правильно:
Исключения:
#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>.