To jest typowy wzorzec, którego używam do indeksowania tokenów w momencie ich pojawiania się: sprawdź, czy token znajduje się na mapie, a jeśli nie, dodaj go do mapy, przypisując rozmiar mapy.Dlaczego ustawienie elementu mapy na jego rozmiar zwiększa rozmiar * przed * przypisaniem go?
Kiedy robi to w C++, to nieoczekiwanie zwiększa mapie za wielkość przed przydział jest wykonany:
#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;
}
ten wypisuje:
Size before adding: 0
Size after adding: 1
What was added: 1
Tak jak ja to rozumiem, to powinien oceń prawą stronę, która wynosi zero, a następnie przekaż ją do funkcji, która umieszcza "A" i zero na mapie. Ale wydaje się, że jest to ocena po rozpoczęciu przypisywania, co nie ma sensu.
Czy nie należy oceniać prawej strony przed operacją przypisania?
Nie, jestem prawie pewien, że to UB. – Borgleader
@Borgleader: Jest to nieokreślone zachowanie. – Nawaz
@Nawaz o prawo, nieokreślony – Borgleader