Extracción de la lista de inicialización de C ++ Constructor

Siempre he sido un buen chico al escribir mis clases, prefijando todas las variables miembro con m_:

class Test {
    int m_int1;
    int m_int2;
public:
    Test(int int1, int int2) : m_int1(int1), m_int2(int2) {}
};

int main() {
    Test t(10, 20); // Just an example
}

Sin embargo, recientemente olvidé hacer eso y terminé escribiendo:

class Test {
    int int1;
    int int2;
public:
    // Very questionable, but of course I meant to assign ::int1 to this->int1!
    Test(int int1, int int2) : int1(int1), int2(int2) {}
};

Lo creas o no, el código compilado sin errores / advertencias y las asignaciones se realizaron correctamente. Fue solo cuando hice la verificación final antes de registrar mi código cuando me di cuenta de lo que había hecho.

Mi pregunta es: ¿por qué se compiló mi código? ¿Se permite algo así en el estándar C ++, o es simplemente un caso de que el compilador es inteligente? En caso de que te lo estés preguntando, estaba usando Visual Studio 2008

Respuestas a la pregunta(5)

Su respuesta a la pregunta