Безымянные правила доступа к пространству имен - PullRequest
6 голосов
/ 08 марта 2012

Я просматривал раздел 7.3.1.1 в стандарте C ++ 03, ожидая найти некоторое описание правил доступа для элементов, определенных в безымянном пространстве имен.

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

namespace {
  int foo;
}

void something()
{
  foo = 4;
}

Если у пространства имен есть имя, вы не сможете этого сделать.Итак, где же правила, определенные в стандарте для этих исключительных правил, которые применяются к безымянным пространствам имен?

Ответы [ 2 ]

7 голосов
/ 08 марта 2012

Анонимное пространство имен в основном рассматривается как:

namespace unique_per_TU
{
    // Stuff
}
using namespace unique_per_TU;

Я постараюсь найти ссылку здесь через минуту.

РЕДАКТИРОВАТЬ:

Похоже, выуже нашел его в 7.3.1.1/1

Безымянное определение пространства имен ведет себя так, как если бы оно было заменено на

namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespacebody }

, где все вхождения уникальны в переводеunit заменяются тем же идентификатором, и этот идентификатор отличается от всех других идентификаторов во всей программе.

Использование "fake" уже приводит членов пространства имен в глобальное пространство имен, как вы обнаружили.

3 голосов
/ 08 марта 2012

Помимо стандартной цитаты, которая определяет Безымянные пространства имен в 7.3.1.1/1,
Это явно указано в одном из примеров в

3.3.5 / 1 Область пространства имен:

Декларативная область определения пространства имен - это тело пространства имен . Потенциальная область, обозначаемая original-namespace-name , является объединением декларативных областей, установленных каждым из определений пространства имен в той же декларативной области с этим original- Пространство имен имя . Считается, что объекты, объявленные в теле пространства имен , являются членами пространства имен, а имена, введенные этими объявлениями в декларативную область пространства имен, называются именами членов пространства имен. Имя члена пространства имен имеет область имен. Его потенциальная область действия включает пространство имен, начиная с пункта объявления имени (3.3.1) и далее; и для каждой директивы using (7.3.4), которая назначает пространство имен члена, Потенциальная сфера действия члена включает ту часть потенциальной сферы действия директивы использования , которая следует за декларацией члена.

>[Example:
namespace N {
      int i;
      int g(int a) { return a; }
      int j();
      void q();
}
namespace { int l=1; }
// the potential scope of l is from its point of declaration
// to the end of the translation unit

namespace N {
    int g(char a) // overloadsN::g(int)
    {
        return l+a; // l is from unnamed namespace
    }
    int i; // error: duplicate definition
    int j(); // OK: duplicate function declaration
    int j() // OK: definition ofN::j()
    {
       return g(i); // callsN::g(int)
    }
    int q(); // error: different return type
}

- конец примера]

Обратите внимание на формулировки:
потенциальная область действия l - от момента объявления до конца единицы перевода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...