使用 nullptr 作为 std::unordered_map 的键有什么后果吗?

Are there any consequences in using a nullptr as a key for std::unordered_map?

本文关键字:什么 后果 map 作为 nullptr std unordered 使用      更新时间:2023-10-16

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

其有效性完全取决于someMap到底是什么。

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

那么问题就变成了比较两个指针的有效性是什么,如果其中一个指针nullptr。这意味着问...地图如何比较其密钥类型?

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

这很重要,因为使用<或任何内容对指针进行正常排序比较只会在指针值之间强加部分排序。可以比较同一数组中的指针,以及指向同一对象中的子对象的指针(对于标准布局类型,按声明排序(。因此,不允许在空指针与除另一个空指针以外的任何指针值之间进行顺序比较。

幸运的是,std::less对指针具有专用化功能,它将所有指针值强加一个总顺序。 相比之下,定义所有指针的总顺序。

但是,如果您提供了不同的比较类型,该比较类型基于调用<而不是std::less,则无法将nullptr插入到此类map中。

如果键类型是某种类似指针的类型,一种基于指针值进行比较的类型,那么同样,最好使用std::less而不是<,否则您会遇到麻烦。

这很好。

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

请确保指针有效。如果不是,仅仅评估它们就有未定义的行为(自C++17以来的实现定义行为(。但是评估空指针很好,因为它不是"无效的",只是在下面。

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

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