Referencia temporal en msvc

¿Por qué compila esto en MS Visual C ++?

struct myClass{};

void func(myClass& arg){}

void main() {
   func( myClass() );  // works even though func only takes myClass& 
}                      // (not const myClass&!!)

¿Funciona también en otros compiladores o es específico de MSVC (o incluso un error de compilación)? Incluso puedo obtener la referencia en este valor como este:

void func(myClass* arg){}

int main() {
    func( &myClass() ); 
}

Esto funciona SOLAMENTE en objetos que se crean temporalmente con un constructor. Esto no funcionaría con ningún otro valor como (myClass () + myClass ()) por ejemplo ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta