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)
这没有什么未定义的。返回operator[]对映射条目的左值引用(如果需要,它会创建该条目)。然后,您只需递增此左值表达式,即基础条目。
求值顺序的规则规定,对于修改赋值操作,副作用在左操作数(即对映射条目的左值引用)和右操作数(即常量1)的求值之后严格排序。这个例子中没有任何歧义。
更新:在您更新的示例中没有任何变化。同样,修改的副作用m[10]严格排序在其他操作之后(即,在右侧评估左值,在右侧评估它,然后执行加法)。
相关的排序规则,来自cppreference:
8) 内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左参数和右参数的值计算(但不是副作用)之后排序,并且是在赋值表达式的值计算之前排序(即在返回对修改对象的引用之前)
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |