Ответ 1
Я считаю, что это нарушает [basic.scope.class]/1 (N3337):
Следующие правила описывают область имен, объявленных в классах.
1) [...]
2) Имя
N
, используемое в классеS
, должно ссылаться на одно и то же объявление в его контексте и при повторной оценке в завершенной областиS
. Диагностика не требуется для нарушения этого правила.
Так как decltype(a)
относится к объявлению в охватывающей области до объявления переменной-члена, но относится к члену, когда "переоценивается в завершенной области действия" X
, программа плохо сформирована. Диагностика не требуется, но GCC предоставляет ее в любом случае (хотя это довольно загадочно). Поведение всех трех компиляторов действительно.