Какая сторона выражения присваивания обрабатывается первым?

Рассмотрим этот код:

std::unordered_map<int, std::string> data;
data[5] = foo();

В каком порядке обрабатываются data[5] и foo()? Если foo() бросает исключение, является 5 пункт в data создается или нет?

Если поведение зависит от версии C++, как отличаются эти версии?