Рассмотрим этот код:
struct foo{};
int main() {
foo::foo a;
}
Я бы ожидал, что это будет хорошо сформировано, объявив переменную типа foo
по правилу в [class]/2 (N4140, emphasis mine):
Имя класса вставляется в область, в которой объявляется сразу после просмотра имени класса. Имя класса также вставляется в область самого класса; это известно как имя введенного класса. Для проверки доступа имя введенного класса рассматривается как имя публичного участника.
clang 3.6.0
согласен со мной, компилируя приведенный выше код без каких-либо предупреждений с помощью -Wall -pedantic
.
gcc 5.2.0
отклоняется, предоставляя следующее сообщение об ошибке:
main.cpp: In function 'int main()':
main.cpp:5:5: error: 'foo::foo' names the constructor, not the type
foo::foo a;
Вышеприведенное выполняется независимо от того, насколько глубоко вложенность введенных имен классов, например. foo::foo::foo::foo
.
Есть ли правило, которое заставляет эту конструкцию интерпретироваться как конструктор в этом контексте или это ошибка gcc
? Или я неправильно интерпретирую цитату стандартов?