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

Это вызвал последний поток на SO.

Анонимное пространство имен считается эквивалентным

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

Я не могу вспомнить точную причину, почему это не эквивалентно

  namespace unique { namespace-body } 
  using namespace unique;

Также пытался искать (включая google), но тщетно. Поделитесь, пожалуйста, любой имеющейся у вас информацией по этому поводу.


person Chubsdad    schedule 09.09.2010    source источник
comment
Кстати, технический термин — безымянное пространство имен.   -  person GManNickG    schedule 09.09.2010


Ответы (1)


Существующая сейчас спецификация была введена в 1995 году в N0783 для исправления углового случая. Чтобы процитировать эту статью (стр. 9):

WP определяет семантику безымянного пространства имен как эквивалентную:

namespace UNIQUE {
    // namespace body
}
using namespace UNIQUE;

Это неверно, поскольку делает код в безымянном пространстве имен зависимым от того, находится ли код в исходном пространстве имен или в расширении пространства имен.

namespace {} // If you remove this line, the
             // use of ::f below is invalid

namespace {
    void f()
    {
        using ::f;
    }
}

WP следует изменить, чтобы определить безымянное пространство имен как эквивалентное:

namespace UNIQUE {}
using namespace UNIQUE;
namespace UNIQUE {
    // namespace body
}
person James McNellis    schedule 09.09.2010
comment
На самом деле, я не понимаю этого полностью. Значит ли это, что показанный фрагмент кода должен быть правильно сформирован в текущем стандарте? - person Chubsdad; 09.09.2010
comment
Да, using ::f следует за using namespace UNIQUE. Поэтому UNIQUE::f вводится в глобальное пространство имен в том месте, где код ссылается на ::f. - person MSalters; 09.09.2010