是否将地图尺寸作为值插入地图未定义的行为?
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]
- [...]如果相对于[...]或使用相同值的值计算,对标量对象的副作用未排序标量对象,行为未定义。
所以是的,行为的确是未定义的。
以上是关于是否将地图尺寸作为值插入地图未定义的行为?的主要内容,如果未能解决你的问题,请参考以下文章