There's nothing evil about the [] operator. You're just doing undefined behavior.
Just like doing i + --i;... you cannot read and write a variable/object multiple times in the same sequence point.
The [] operator (potentially) modifies the size of the map, and size() obviously reads the size of the map. So the result of that read+write order depends on which of those the compiler decides to do first.
This should never be done, and any analysis of the output is meaningless - it's undefined.
discord[i] and discord.size() are indeterminately sequenced, aren't they?
Both are function calls; the two calls can't be interleaved; and so the behaviour is not undefined.
It will either be discord[i] first or discord.size() first (and nothing else).