Неоднозначный поиск имени с помощью директивы using

Не допускается помещать пространство имен и класс с одинаковым именем в одну декларативную область, т.е.

namespace A {}
class A{};

плохо сформирован (см. §3.3.1 / 4). Тем не менее, можно ввести имя любого из них с помощью директивы using:

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 принимает это.

Кто прав?

8

Решение

Код плохо сформирован. При поиске A§7.3.4 / 6 шагов в:

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

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

6

Другие решения


По вопросам рекламы [email protected]