C++ 使用nullptr作为std::unordered_映射的键会有任何后果吗?

C++ 使用nullptr作为std::unordered_映射的键会有任何后果吗?,c++,pointers,C++,Pointers,在执行someMap.insert(make_pair(nullptr,nullptr))时是否会出现任何副作用/问题?不包括取消引用空指针的危险。在someMap.insert(make_pair(nullptr,nullptr))中没有冲突。但是,当使用此元素不取消引用nullptr时,您需要注意,否则您的程序将具有未定义的行为(并可能触发分段错误) 注意:显然,映射需要在键中有一个指针,在值中有一个指针,否则表达式可能导致编译错误,或者在最坏的情况下导致未定义的行为。这很好 空指针是指针要

在执行
someMap.insert(make_pair(nullptr,nullptr))
时是否会出现任何副作用/问题?不包括取消引用空指针的危险。

someMap.insert(make_pair(nullptr,nullptr))
中没有冲突。但是,当使用此元素不取消引用
nullptr
时,您需要注意,否则您的程序将具有未定义的行为(并可能触发分段错误)

注意:显然,映射需要在键中有一个指针,在值中有一个指针,否则表达式可能导致编译错误,或者在最坏的情况下导致未定义的行为。

这很好

空指针是指针要保留的有效值。你可以用它做任何你可以用任何其他有效指针做的事情(除了取消引用它)


一定要确保你的指针是有效的。如果不是,则仅对其进行评估就具有未定义的行为()。但是计算空指针是可以的,因为它不是“无效的”,只是不可参考。

它的有效性完全取决于
someMap
到底是什么

让我们假设
someMap
有一个键类型,它是一个实际的指针(也就是说,不是一个类似指针的类型,而是某种
T*

然后问题就变成了,如果两个指针中有一个是
nullptr
,那么比较这两个指针的有效性是什么。也就是说问。。。地图如何比较其键类型

std::map
的键比较是可配置的。默认情况下,它使用
std::less


这一点很重要,因为使用
对指针进行常规排序比较如果使用指针类型作为映射的键,则
nullptr
是该键的有效值。当您在未经检查的情况下使用密钥(例如,在迭代中)解除保护(即访问内容)时,可能会出现问题。但这是指针的一个普遍问题,不是吗?对于无序映射,它取决于哈希函数。如果散列函数只使用指针的数值-没问题。(我坚信这是指针散列的默认设置。)但是如果您使用自定义版本去引用指针…-请参见上文。仅供参考:@Peter-什么是非指针类型?
nullptr
与非指针类型不兼容。这就是它的全部目的。什么是
someMap
?是键
std::nullptr\u t
还是其他什么?“…您有一个分段错误。”如果幸运的话。如果运气不好,它可能会出现工作。