На https://en.cppreference.com/w/cpp/utility/hash говорится, что начиная с С++ 17
Каждый стандартный заголовок библиотеки, который объявляет шаблон std :: hash, обеспечивает включенные специализации std :: hash для std :: nullptr_t и всех арифметических типов без cv (включая любые расширенные целочисленные типы), всех типов перечисления и всех типов указателей.
Итак, компилятор, совместимый с С++ 17, должен скомпилировать эту маленькую программу:
#include <functional>
int main()
{
std::hash<std::nullptr_t> h;
return h(nullptr);
}
Однако GCC и Clang сообщают об ошибке, говоря, что конструктор по умолчанию std::hash<std::nullptr_t>
(неявно) удален. Смотрите здесь и здесь, чтобы убедиться в этом сами.
Visual Studio его компилирует. По-видимому, он возвращает 0
672807365
.
Q1: GCC и Clang просто по-прежнему не имеют этой функции С++ 17, поскольку, по общему признанию, она не является приоритетной? Или я что-то упустил?
Q2: Могу ли я просто специализировать его самостоятельно и вернуть 0
672807365
как Visual Studio? Разве не лучше использовать какое-то другое значение, например, простое число, для объединения его с другими хэшами?
Обновить
Из-за моего ограниченного знания ассемблера я думал, что Visual Studio возвращает 0
. Фактически он возвращает 672807365
(значение в eax
). Итак, мой второй вопрос в основном отвечает сам по себе: я не верну 0
в моей специализации, чтобы обойти эту ошибку.