使用 nullptr 作为 std::unordered_map 的键有什么后果吗?
Are there any consequences in using a nullptr as a key for std::unordered_map?
做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
否则程序将具有未定义的行为(并可能触发分段错误(。
注意:显然,映射需要在键中有一个指针,在值中有一个指针,否则表达式可能会导致编译错误,或者在最坏的情况下导致未定义的行为。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 使用 nullptr 作为 std::unordered_map 的键有什么后果吗?
- 在C++中使用异常的可能的错误处理策略是什么,它们的后果和影响是什么
- 我什么时候应该使用删除?(在动态创建的2D数组之后未删除的后果)
- C 指针初始化的不良初始化可能是什么后果
- 内存泄漏的长期后果是什么?
- 不调用libusb_exit()会产生什么后果
- 强制QObject作为QWidget的父级的后果是什么?
- 有一个指向此的静态指针会产生什么后果
- 在c++ 0x中忽略窄化转换的后果是什么?
- c++ fprintf函数调用中格式/参数类型不匹配的可能后果是什么?
- 父类有虚方法而派生类没有虚方法的后果是什么?
- "screwing up"赋值运算符的后果是什么?
- 在VisualStudio2010中混合使用异常处理模型会产生什么后果
- 在条件语句中简单检查指针值的后果是什么?