Рассмотрим
using namespace std;
template <typename S, typename T> struct hash<pair<S, T>>
{
inline size_t operator()(const pair<S, T> &v) const
{
return 0;
}
};
В этом случае и GCC, и Clang компилируют его без предупреждений. Это, однако, противоречит тому, что я прочитал в Интернете, что определение вашей собственной хэш-функции, которая будет использоваться с неупорядоченными типами стандартной библиотеки, требует, чтобы вы поместили определение в пространство имен std.
Интересно, специализируюсь только на pair<int, int>
:
template <> struct hash<pair<int, int>>
{
size_t operator()(const pair<int, int> &v) const
{
size_t seed = 0;
return seed;
}
};
приводит к ошибке, как мы и ожидаем.
Однако почему первое не приводит к каким-либо предупреждениям компилятора, несмотря на то, что мы не помещаем его в пространство имен std?