Попытка определить элемент пространства имен с помощью объявления-объявления
Рассмотрим следующую программу. Является ли он корректным или нет в соответствии со стандартом С++ (ссылки на соответствующие части стандарта необходимы):
namespace X { extern int i; }
namespace N { using X::i; }
int N::i = 1;
int main() {}
Я получаю разные результаты для разных компиляторов. Я пытаюсь выяснить, для компилятора я должен представить отчет об ошибке для:
Для сравнения ниже приведена ошибка компилятора со всеми тремя компиляторами:
namespace X { void f(); }
namespace N { using X::f; }
void N::f() {};
int main() {}
Ответы
Ответ 1
Текущий рабочий проект N4527, [8.3p1]:
[...] Когда идентификатор объявления является квалифицированным, декларация должна ссылаться на ранее объявленный член класса или пространства имен, к которому квалификатор ссылается (или, в случае пространства имен, на элемент встроенного пространства имен этого пространства имен (7.3.1)) или специализации их; член не просто вводится использование-объявления в области класса или пространства имен, номинированных спецификатор вложенного имени идентификатора declarator-id. [...]
Итак, определенно плохо сформировался; GCC и MSVC ошибочны.