是否将地图尺寸作为值插入地图未定义的行为?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否将地图尺寸作为值插入地图未定义的行为?相关的知识,希望对你有一定的参考价值。

我正在阅读PVS blog帖子,他们提到以下错误。

(减少)

std::map<int,int> m;
m[7]=5;
auto val = 15;
if (!m.contains(val))
    m[val] = m.size(); // bug here

根据博客文章,这是越野车。我一直认为map的operator []调用是函数调用,因此.size()在[]之前排序,因为函数充当序列点。

所以为什么这是个错误?

注意:我知道自C ++ 11起就不存在序列点,但是我使用它们是因为新的用语很难理解。

答案

Pre C ++ 17

=的两个操作数的求值相对于彼此没有顺序。

[m[val]m.size()可以按任何顺序求值(甚至可以重叠-交错CPU指令)。

正在考虑:

  • [m[val]具有修改地图大小(标量)的副作用

  • m.size()的值计算访问地图的大小

§1.9程序执行[intro.execution]

  1. [...]如果相对于[...]或使用相同值的值计算,对标量对象的副作用未排序标量对象,行为未定义。

所以是的,行为的确是未定义的。

以上是关于是否将地图尺寸作为值插入地图未定义的行为?的主要内容,如果未能解决你的问题,请参考以下文章

将数组作为结构访问与未定义的行为

添加到std :: map的元素是否自动初始化?

Echarts 地图 省份的颜色自定义如何设置?

Echarts 地图 省份的颜色自定义如何设置?

如何使 iOS 7 控制中心的行为与地图(小标签)中的行为一样?

地图悬停和点击谷歌地图