Interacción entre decltype y nombre de miembro de clase sombreando un nombre externo
Este código
int clash;
struct Foo {
decltype(clash) clash;
};
se compila silenciosamente en el sonido metálico, pero no se compila en gcc dando los errores
error: declaración de 'int Foo :: clash' [-fpermissive]
error: cambia el significado de 'clash' de 'int clash' [-fpermissive]
Parece que se requieren 2 ingredientes para que surja el error:
El sombreado debe ser realizado por un miembro de la clase (no hay problema si es el alcance local de una función).
decltype ([nombre sombreado]) debe usarse en el ámbito de sombreado antes de la declaración de [nombre sombreado].
Mi pregunta es doble:
¿Se justifica gcc al rechazar este código?¿Dónde lo dice en el estándar?