std :: map operator [] - 未定义的行为?

Dim*_*imG 6 c++ dictionary stl stdmap undefined-behavior

我只是坚持以下问题:这是否会导致未定义的行为,为什么?

std::map<int, int> m;
m[10] += 1;
Run Code Online (Sandbox Code Playgroud)

它编译和运行完美,但它没有任何证据.它类似于一个普通的UB例子,i = ++i + i++;因为operator[]它确实有副作用,但另一方面假设任何评估顺序(从左到右和从右到左)使我进入地图的相同最终状态

PS可能相关:http://en.cppreference.com/w/cpp/language/eval_order

编辑

对不起,我应该写的

 m[10] = m[10] + 1;
Run Code Online (Sandbox Code Playgroud)

Sme*_*eey 3

这没有什么未定义的。返回operator[]对映射条目的左值引用(如果需要,它会创建该条目)。然后,您只需递增此左值表达式,即基础条目。

求值顺序的规则规定,对于修改赋值操作,副作用在左操作数(即对映射条目的左值引用)和右操作数(即常量1)的求值之后严格排序。这个例子中没有任何歧义。

更新:在您更新的示例中没有任何变化。同样,修改的副作用m[10]严格排序在其他操作之后(即,在右侧评估左值,在右侧评估它,然后执行加法)。

相关的排序规则,来自cppreference

8) 内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左参数和右参数的值计算(但不是副作用)之后排序,并且是在赋值表达式的值计算之前排序(即在返回对修改对象的引用之前)