7 Declarations [dcl.dcl]

7.3 Namespaces [basic.namespace]

7.3.1 Namespace definition [namespace.def]

7.3.1.1 Unnamed namespaces [namespace.unnamed]

An unnamed-namespace-definition behaves as if it were replaced by

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

where inline appears if and only if it appears in the unnamed-namespace-definition, all occurrences of unique in a translation unit are replaced by the same identifier, and this identifier differs from all other identifiers in the entire program.94Example:

namespace { int i; }            // unique  ::i
void f() { i++; }               // unique  ::i++

namespace A {
  namespace {
    int i;                      // A:: unique  ::i
    int j;                      // A:: unique  ::j
  }
  void g() { i++; }             // A:: unique  ::i++
}

using namespace A;
void h() {
  i++;                          // error: unique  ::i or A:: unique  ::i
  A::i++;                       // A:: unique  ::i
  j++;                          // A:: unique  ::j
}

 — end example ]

Although entities in an unnamed namespace might have external linkage, they are effectively qualified by a name unique to their translation unit and therefore can never be seen from any other translation unit.