Попытка определить элемент пространства имен с помощью объявления-объявления

Рассмотрим следующую программу. Является ли он корректным или нет в соответствии со стандартом С++ (ссылки на соответствующие части стандарта необходимы):

namespace X { extern int i; }

namespace N { using X::i; }

int N::i = 1;

int main() {}

Я получаю разные результаты для разных компиляторов. Я пытаюсь выяснить, для компилятора я должен представить отчет об ошибке для:

  • Clang: дает следующую ошибку компилятора: ни один член с именем 'i' в пространстве имен 'N'

  • GCC и Visual С++ компилирует его без ошибок.

Для сравнения ниже приведена ошибка компилятора со всеми тремя компиляторами:

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 ошибочны.