Неоднозначный поиск имен с помощью директивы using-directive
запрещено помещать пространство имен и класс с одинаковым именем в одну декларативную область, т. е.
namespace A {}
class A{};
плохо сформированных (см. §3.3.1/4). Однако можно ввести имя любого из них с помощью директивы using-directive:
namespace N { namespace A {int i;} }
struct A {static int i;};
using namespace N;
int i = A::i; // The global struct, or namespace N::A?
этот код плохо образован? VC++ думает, что так, а также лязгом:
, GCC принимает его.main.cpp:7:9: error: reference to 'A' is ambiguous int i = A::i; ^ main.cpp:3:8: note: candidate found by name lookup is 'A' struct A {static int i;}; ^ main.cpp:1:25: note: candidate found by name lookup is 'N::A' namespace N { namespace A {int i;} } ^
кто прав?
1 ответов
код-это плохо сформированные. При взгляде вверх A
, §7.3.4/6 шагов в:
если поиск имени находит объявление для имени в двух разных пространства имен и объявления не объявляют одну и ту же сущность и делают не объявляйте функции, использование имени неправильно сформировано.
здесь пространства имен являются глобальным пространством имен и N
, а сущности-это пространство имен N::A
и класс ::A
.