A atribuição em C ++ ocorre apesar da exceção no lado direito

Tenho algum código (C ++ 14) parecido com este:

map<int, set<string>> junk;
for (int id : GenerateIds()) {
    try {
        set<string> stuff = GetStuff();
        junk[id] = stuff;
    } catch (const StuffException& e) {
        ...
    }
}

Isso funciona. As vezesGetStuff() lança uma exceção, que funciona bem, porque, se isso acontecer, não quero um valor no mapa de lixo eletrônico entã

Mas no começo eu escrevi isso no loop, o que não funciona:

junk[id] = GetStuff();

Mais precisamente, mesmo quandoGetStuff() lança uma exceção,junk[id] é criado (e atribuído um conjunto vazio

Isto não é o que eu esperaria: eu esperaria que eles funcionassem da mesma maneir

Existe um princípio de C ++ que eu não entendi aqu

questionAnswers(3)

yourAnswerToTheQuestion