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
还是其他什么?“…您有一个分段错误。”如果幸运的话。如果运气不好,它可能会出现工作。