Неоднозначный поиск имен с помощью директивы 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++ думает, что так, а также лязгом:

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;} }
                        ^
, GCC принимает его.

кто прав?

1 ответов


код-это плохо сформированные. При взгляде вверх A, §7.3.4/6 шагов в:

если поиск имени находит объявление для имени в двух разных пространства имен и объявления не объявляют одну и ту же сущность и делают не объявляйте функции, использование имени неправильно сформировано.

здесь пространства имен являются глобальным пространством имен и N, а сущности-это пространство имен N::A и класс ::A.