这是我用来索引标记的常见模式:检查标记是否在地图中,如果没有,则将其添加到地图中,并分配地图的大小。
在 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”和零放入地图的函数。但它似乎在开始分配后对其进行评估,这没有任何意义。
在赋值操作之前不应该评估右手边吗?