16

Рассмотрите следующую программу. Хорошо ли он сформирован или не в соответствии со стандартом C++ (ссылки на соответствующие разделы стандарта необходимо):Попытка определить элемент пространства имен посредством использования-объявления

namespace X { extern int i; } 

namespace N { using X::i; } 

int N::i = 1; 

int main() {} 

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

  • Clang: Выдает следующую ошибку компилятора: Ни один член с именем «я» в пространстве имен «N»

  • НКУ и Visual C++ компилирует его без ошибок.

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

namespace X { void f(); } 

namespace N { using X::f; } 

void N::f() {}; 

int main() {} 
+1

Смешно, VS2013 компилируется, но IntelliSence говорит '' Ошибка: пространство имен «N» не имеет действительного члена «i» ' – AlexD

+0

Я думаю, что ответ здесь: [link] (http://stackoverflow.com/questions/6175705/scope-of-use-declaration-inside-namespace) – Jorj

+0

@Supremum Вы можете получить свою собственную копию стандарта C++ для чтения по адресу https://isocpp.org/std/the-standard. – Coder

ответ

11

Текущий рабочий проект N4527, [8.3p1]:

[...] When the declarator-id is qualified, the declaration shall refer to a previously declared member of the class or namespace to which the qualifier refers (or, in the case of a namespace, of an element of the inline namespace set of that namespace (7.3.1)) or to a specialization thereof; the member shall not merely have been introduced by a using-declaration in the scope of the class or namespace nominated by the nested-name-specifier of the declarator-id. [...]

Так, безусловно, плохо сформировавшимися; GCC и MSVC ошибочны.

Смежные вопросы