【发布时间】:2013-08-05 02:09:57
【问题描述】:
这是一种常见的模式,用于在标记进入时对其进行索引:检查标记是否在地图中,如果没有,则将其添加到地图中,并指定地图的大小。
在 C++ 中执行此操作时,它会意外地增加地图的大小在进行分配之前:
#include <cstdio>
#include <map>
using namespace std;
int main() {
map<char, int> m;
printf("Size before adding: %d\n", m.size());
m['A'] = m.size();
printf("Size after adding: %d\n", m.size());
printf("What was added: %d\n", m['A']);
return 0;
}
打印出来:
Size before adding: 0
Size after adding: 1
What was added: 1
按照我的理解,它应该评估右侧为零,然后将其传递给将“A”和零放入地图的函数。但是它似乎在它开始分配后对其进行评估,这没有意义。
在赋值操作之前不应该评估右手边吗?
【问题讨论】:
-
不,我很确定这是 UB。
-
@Borgleader:这是未指定的行为。
-
@Nawaz 哦,对了,未指定
-
只是一个想法。你能用
struct X { char c; int id; }; set<X> s代替map<char, int> m;吗?使用计数器生成id。 -
@BenjaminLindley:在这种情况下,这不是
i。在这种情况下,这是m,它是用户定义的类型。它出现在两边。size_type的创建和初始化发生在 inside 函数operator[]后面是序列点,实际上是许多序列点,然后 assignment 发生在用户代码中(函数外)。它们之间有很多序列点。我没有看到 UB。
标签: c++ map assignment-operator