Подтвердить что ты не робот

Является ли декларация члена `decltype (name) name;` разрешена в локальной структуре, где первое имя относится к охватывающей области?

Пример:

int main()
{
    int a = 0;
    struct X
    {
        decltype(a) a;
    };
    return 0;
}

decltype(a) относится к локальному a в main, а член, который он объявляет, имеет одно и то же имя.

Clang компилируется без какой-либо проблемы, так же как и MSVC14.

g++ жалуется на него, добавив -fpermissive, чтобы он прошел, хотя

prog.cc:6:21: error: declaration of 'int main()::X::a' [-fpermissive]
         decltype(a) a;
                     ^
prog.cc:3:9: error: changes meaning of 'a' from 'int a' [-fpermissive]
     int a = 0;

Какое поведение стандартно-совместимо?

4b9b3361

Ответ 1

Я считаю, что это нарушает [basic.scope.class]/1 (N3337):

Следующие правила описывают область имен, объявленных в классах.

1) [...]

2) Имя N, используемое в классе S, должно ссылаться на одно и то же объявление в его контексте и при повторной оценке в завершенной области S. Диагностика не требуется для нарушения этого правила.

Так как decltype(a) относится к объявлению в охватывающей области до объявления переменной-члена, но относится к члену, когда "переоценивается в завершенной области действия" X, программа плохо сформирована. Диагностика не требуется, но GCC предоставляет ее в любом случае (хотя это довольно загадочно). Поведение всех трех компиляторов действительно.