【发布时间】:2016-10-03 13:25:48
【问题描述】:
我刚刚提出了以下问题:这是否会导致未定义的行为,为什么?
std::map<int, int> m;
m[10] += 1;
它可以完美地编译和运行,但并不能证明什么。
它类似于常见的 UB 示例 i = ++i + i++;,因为 operator[] 确实有副作用,但另一方面,假设任何评估顺序(从左到右和从右到左)都会让我进入地图的相同最终状态
附:可能相关:http://en.cppreference.com/w/cpp/language/eval_order
编辑
对不起,我应该写的
m[10] = m[10] + 1;
【问题讨论】:
-
这样的问题确实表明语言变得过于复杂了
-
这怎么可能是UB?
-
@Destructor,请看编辑,有什么变化吗?
-
@Slava 答案很简单……
operator[]默认在键10处构造一个映射值,并将其加一,正如人们所期望的那样。我不明白这有多复杂 -
如果
m[10] = m[10] + 1;之类的行为未定义,则[ ]严重损坏。
标签: c++ dictionary stl undefined-behavior stdmap