On https://en.cppreference.com/w/cpp/utility/hash это говорит о том, что с C ++ 17
Каждый стандартный заголовок библиотеки, который объявляет шаблон std :: hash
предоставляет включенные специализации std :: hash для std :: nullptr_t и
все cv-неквалифицированные арифметические типы (включая любое расширенное целое число
типы), все типы перечисления и все типы указателей.
Итак, компилятор, совместимый с C ++ 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 просто по-прежнему отсутствует эта функция C ++ 17, поскольку, по общему признанию, она не является приоритетной? Или я что-то упустил?
Q2: Могу ли я просто специализировать его самостоятельно и вернуть 0
672807365
как Visual Studio? Не будет ли другого значения, например, какое-то простое число, лучше было бы объединить его с другими хэшами?
Обновление
Из-за моего ограниченного знания ассемблера я думал, что Visual Studio возвращает 0
. Фактически он возвращает 672807365
(значение в eax
).
Итак, мой второй вопрос в основном отвечает сам по себе: я не верну 0
в моей специализации, чтобы обойти эту ошибку.