【发布时间】:2019-06-06 10:03:23
【问题描述】:
在https://en.cppreference.com/w/cpp/utility/hash 上,它表示从 C++17 开始
声明模板 std::hash 的每个标准库头文件 为 std::nullptr_t 和 所有 cv 非限定算术类型(包括任何扩展整数 types)、所有枚举类型和所有指针类型。
所以,一个 C++17 兼容的编译器应该编译这个小程序:
#include <functional>
int main()
{
std::hash<std::nullptr_t> h;
return h(nullptr);
}
但是,GCC 和 Clang 都报告了一个错误,指出 std::hash<std::nullptr_t> 的默认构造函数已(隐式)删除。
请参阅here 和here 自行验证。
Visual Studio 会编译它。显然它返回 0672807365.
Q1: GCC 和 Clang 是否仍然缺少这个 C++17 特性,诚然这不是一个高优先级的特性?还是我错过了什么?
Q2:我是否可以像 Visual Studio 一样只专注于它并返回 0672807365? 不会有其他值,例如一些素数,将其与其他哈希组合更好?
更新
由于我对汇编程序的了解有限,我认为 Visual Studio 正在返回 0。实际上,它正在返回672807365(eax 中的值)。
所以,我的第二个问题基本上可以自己回答:我不会在我的专业领域返回0 来解决这个错误。
【问题讨论】:
-
抱歉,回滚了我的编辑。错字在源...
-
@user463035818 cppreference 是一个维基。比回滚更好,您可以更正该页面。我刚刚做了,你可以回滚你的回滚。
-
@YSC 哈哈,我又检查了一遍,发现有一个大胖子
Edit按钮。我想我已经习惯了,以至于在某些时候我开始忽略它。下次我就知道了 -
在 clang HEAD 上工作,返回 156。wandbox.org/permlink/tu1WxRoqhGwv6Cm7
-
libstdc++ 中的错误? libc++ 很好(使用 -stdlib=libc++)