これは、トークンが入ってくるときにインデックスを作成するために使用する一般的なパターンです。トークンがマップ内にあるかどうかを確認し、そうでない場合はマップに追加して、マップのサイズを割り当てます。
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」とゼロをマップに入れる関数に渡す必要があります。しかし、割り当てを開始した後に評価しているように見えますが、これは意味がありません。
代入操作の前に右辺を評価するべきではありませんか?