La asignación en C ++ se produce a pesar de la excepción en el lado derecho

Tengo un código (C ++ 14) que se ve así:

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

Esto funciona. Algunas vecesGetStuff() lanza una excepción, que funciona bien, porque si lo hace, entonces no quiero un valor en el mapa basura.

Pero al principio había escrito esto en el bucle, que no funciona:

junk[id] = GetStuff();

Más precisamente, incluso cuandoGetStuff() lanza una excepción,junk[id] se crea (y se le asigna un conjunto vacío).

Esto no es lo que esperaría: esperaría que funcionaran de la misma manera.

Existe un principio de C ++ que he entendido mal aquí?

Respuestas a la pregunta(3)

Su respuesta a la pregunta