繁体   English   中英

使用 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.insert(make_pair(nullptr, nullptr))没有违规 但是你需要注意在使用这个元素时不要取消nullptr引用,否则你的程序会有未定义的行为(并且可能会触发 Segmentation Fault)。

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

这可以。

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

请确保您的指针有效。 如果不是,仅对它们求值就具有未定义的行为(自 C++17 以来实现定义的行为)。 但是评估一个空指针很好,因为它不是“无效”,只是无法引用。

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

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

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

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

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

对你来说幸运的是, std::less对指针进行了专门化,它对所有指针值强加了一个总顺序 相比之下,定义了所有指针的总顺序。

但是,如果您提供了一种不同的比较类型,一种基于调用<而不是std::less比较类型,那么您不能将nullptr插入到这样的map

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM