title: How to alias the global namespace in C++11
body: <p><strong>Short Form</strong>:  How can I define an alias for the root (global) namespace in C++11 ?  It might look like</p>
  
  <p><code>namespace root_namespace = :: ;</code></p>
  
  <p>where the scope resolution operator in its naked form above is a place holder for some handle of the global namespace.  I read in the <a href="http://gcc.gnu.org/onlinedocs/gccint/Namespaces.html" rel="nofollow">GCC Internals Manual</a> that</p>
  
  <p>...The root of the [compiler's] entire intermediate representation is the variable global_namespace. This is the namespace specified with <code>::</code> in C++ source code... The name of the global namespace is <code>::</code>, even though in C++ the global namespace is unnamed.</p>
  
  <p><strong>PS EDIT</strong>: to respondents to-date, I appended a <strong>painfuly long form</strong> to address some concerns after the following <strong>long form</strong>, since it <em>may</em> clarify some things.  And followers, if you see us talking at rather than to each other, dig in.</p>
  
  <hr>
  
  <p><strong>Long Form</strong>: An example of its potential use follows.  If unsatisfactory, then yes, this is an academic question ; see the <strong>painfully long form</strong> that follows this one.</p>
  
  <p>Imagine that your boss barges in one day and says, "I just read a book about post-positivism.  Get rid of <code>namespace ObjectiveReality</code>."  In the code below, 'all' you have to do is omit the lines I've marked like <code>/* -&gt; */</code> this <code>/* &lt;- */</code>.  You <strong>can</strong> do that for intermediate levels of nesting currently ; however, I am uncertain how to define the global-scope <code>namespace current_authority</code> to allow simple elision of the first non-global namespace.</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#include &lt;iostream&gt;
  #include &lt;iomanip&gt;
  
  
  // ...
  using cat_is_alive = std::true_type ; // because I like cats
  using cat_is_alive = ::cat_is_alive ; // seems to work, see `g++ -v` below
  // ...
  
  
  // ASIDE: I originally had `namespace higher_authority = COMPILER ;` as a comment, but changed it for simpler chaining closure
  
  // The next two lines are the crux of my question...
  
  namespace higher_authority = global_namespace ;
  namespace current_authority = global_namespace ; // a.k.a. the naked ::
  
  // If the above two lines defined aliases for the (unnamed) global namespace, then the suggested elisions/replacements work...
  
  /* -&gt; */
  namespace ObjectiveReality {
  /* &lt;- */
  // Simplest fix: replace with `using ObjectiveReality = current_authority ;`
  //   (Otherwise, a few other changes are necessary)
  
      namespace higher_authority = current_authority ;
      namespace current_authority = ObjectiveReality ;
  
      using cat_is_alive = higher_authority::cat_is_alive ;
  
      namespace EntangledObserver {
  
          namespace higher_authority = current_authority ;
          namespace current_authority = EntangledObserver ;
  
          using cat_is_alive = higher_authority::cat_is_alive ;
      } ;
  /* -&gt; */
  } ;
  /* &lt;- */
  
  
  int main( int argc, char** argv ) {
  
      std::cout
          &lt;&lt; "It is "
          &lt;&lt; ObjectiveReality::EntangledObserver::cat_is_alive::value
         &lt;&lt; " that the cat is alive." &lt;&lt; std::endl ;
  
      return 0 ;
  }
  
  
  // EOF
  </code></pre>
  
  <p>In case compiler info is needed:</p>
  
  <pre><code>$ g++ -std=c++11 -v
  
  Using built-in specs.
  COLLECT_GCC=g++
  COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.7/lto-wrapper
  Target: i686-linux-gnu
  Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-11precise2' 
  --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs 
  --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 
  --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib 
  --without-included-gettext --enable-threads=posix
  --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib
  --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug 
  --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin
  --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686
  --with-multilib-list=m32,m64 --with-tune=generic --enable-checking=release 
  --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
  Thread model: posix
  gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-11precise2) 
  </code></pre>
  
  <hr>
  
  <p><strong>PAINFULLY LONG FORM</strong>: as a response to some answers about "start from a nested namespace," note that 'HOME!' is inaccessible, and that I may not have the luxury of hand-picking namespaces in a team.</p>
  
  <pre class="lang-cpp prettyprint-override"><code>//
  // alice.cpp
  //
  
  
  #include &lt;iostream&gt;
  #include &lt;type_traits&gt;
  
  
  /////
  ///// The Setup
  /////
  
  //
  // One-and-a-half macros
  //
  
  // BOO! Get rid of this case!
  #define ENABLE_SUBSPACE_1( namespace_name ) \
      namespace namespace_name { \
      namespace last_namespace = ::namespace_name ; \
      namespace this_namespace = ::namespace_name ;
  
  // YEAH! Instead, define 'namespace this_namespace = :: ;' and then...
  #define ENABLE_SUBSPACE( namespace_name ) \
      namespace namespace_name { \
      namespace last_namespace = this_namespace ; \
      namespace this_namespace = last_namespace::namespace_name ;
  
  //
  // Some characters
  //
  
  struct dorothy {
      static constexpr auto obvious_statement = "There's no place like " ;
  } ;
  
  struct rabbit {
      template&lt; typename T &gt;
      static constexpr char const* says( T ) {
          return T::value ? "I'm late!" : "I'm late, but I ditched that addled girl." ;
      }
  } ;
  
  struct alice {
  
      using blue_pill = std::false_type ;
      static constexpr auto where_am_i = "HOME!" ;
  } ;
  
  
  /////
  ///// The Central Structure
  /////
  
  ENABLE_SUBSPACE_1( oxford_england ) // {
  
      using has_strangers_with_candy = std::true_type ;
  
      struct alice {
          using blue_pill = this_namespace::has_strangers_with_candy ;
          static constexpr auto where_am_i = "Uncle Charles' picnic blanket." ;
      } ;
  
  ENABLE_SUBSPACE( rabbit_hole ) // {
      struct rabbit { using is_late = typename alice::blue_pill ; } ;
  ENABLE_SUBSPACE( rabbit_hole ) // {
      struct rabbit { using is_late = typename alice::blue_pill ; } ;
  ENABLE_SUBSPACE( rabbit_hole ) // {
      struct rabbit { using is_late = typename alice::blue_pill ; } ;
      using has_strangers_with_candy = std::false_type ; ///// Different...
  ENABLE_SUBSPACE( rabbit_hole ) // {
      struct rabbit { using is_late = typename alice::blue_pill ; } ;
  ENABLE_SUBSPACE( rabbit_hole ) // {
      struct rabbit { using is_late = typename alice::blue_pill ; } ;
      struct alice { ///// Different...
          using blue_pill = has_strangers_with_candy ;
          static constexpr auto where_am_i = "needing a fix." ;
      } ;
  ENABLE_SUBSPACE( rabbit_hole ) // {
      struct rabbit { using is_late = typename alice::blue_pill ; } ;
      struct alice : last_namespace::alice { ///// Different...
          static constexpr auto where_am_i = "an empty rabbit hole." ;
      } ;
  } ; // END rabbit_hole
  } ; // END rabbit_hole
  } ; // END rabbit_hole
  } ; // END rabbit_hole
  } ; // END rabbit_hole
  } ; // END rabbit_hole
  } ; // END oxford_england
  
  
  /////
  ///// Snarky Output
  /////
  
  int main( int argc, char** argv ) {
  
      std::cout &lt;&lt; std::endl
          &lt;&lt; dorothy::obvious_statement
          &lt;&lt; alice::where_am_i
          &lt;&lt; std::endl ; // There's no place like HOME!
  
      std::cout
          &lt;&lt; dorothy::obvious_statement
          &lt;&lt; oxford_england::rabbit_hole::rabbit_hole::rabbit_hole::rabbit_hole::rabbit_hole::alice::where_am_i
          &lt;&lt; std::endl ; // There's no place like needing a fix.
  
      std::cout
          &lt;&lt; dorothy::obvious_statement
          &lt;&lt; oxford_england::rabbit_hole::rabbit_hole::rabbit_hole::rabbit_hole::rabbit_hole::rabbit_hole::alice::where_am_i
          &lt;&lt; std::endl ; // There's no place like an empty rabbit hole.
  
      std::cout &lt;&lt; std::endl
          &lt;&lt; rabbit::says(
              oxford_england::
                  rabbit_hole::
                      rabbit_hole::
                          rabbit_hole::
                              rabbit_hole::
                                  rabbit_hole::rabbit::is_late()
          ) &lt;&lt; std::endl ; // I'm late!
      std::cout
          &lt;&lt; rabbit::says(
              oxford_england::
                  rabbit_hole::
                      rabbit_hole::
                          rabbit_hole::
                              rabbit_hole::
                                  rabbit_hole:: // NOTE : alice::blue_pill is false_type
                                      rabbit_hole::rabbit::is_late() // ... not this time ; Alice is crashing.
          ) &lt;&lt; std::endl ; // I'm late, but I ditched that addled girl.
  
      std::cout &lt;&lt; std::endl
          &lt;&lt; dorothy::obvious_statement
          &lt;&lt; oxford_england::
                  rabbit_hole:: // 1
                      rabbit_hole:: // 2
                          rabbit_hole:: // 3
                              rabbit_hole:: // 4
                                  rabbit_hole:: // 5
                                      rabbit_hole:: // rabbit_hole #6
                                  last_namespace:: // rabbit_hole #5
                              last_namespace:: // rabbit_hole #4
                          last_namespace:: // rabbit_hole #3
                      last_namespace:: // rabbit_hole #2
                  last_namespace:: // rabbit_hole #1
              last_namespace::alice::where_am_i // oxford_england
          &lt;&lt; std::endl ; // There's no place like Uncle Charles' picnic blanket.
      std::cout
          &lt;&lt; dorothy::obvious_statement
          &lt;&lt; oxford_england::
                  rabbit_hole::
                      rabbit_hole::
                          rabbit_hole::
                              rabbit_hole::
                                  rabbit_hole::
                                      rabbit_hole::
                                  last_namespace::
                              last_namespace::
                          last_namespace:: // 3
                      last_namespace:: // 2
                  last_namespace:: // 1
              last_namespace:: // oxford
          last_namespace::alice::where_am_i // not the global namespace!
          &lt;&lt; ".. but I'd rather be " &lt;&lt; ::alice::where_am_i // the global namespace.
          &lt;&lt; std::endl ; // There's no place like Uncle Charles' picnic blanket... but I'd rather be HOME!
  
      std::cout &lt;&lt; std::endl ;
      return 0 ;
  }
  
  
  /////
  ///// EOF
  /////
  
  
  /* Compiled with:
      `g++ -std=c++11 -o alice alice.cpp`
  */
  
  /* Output of `alice` :
  
  There's no place like HOME!
  There's no place like needing a fix.
  There's no place like an empty rabbit hole.
  
  I'm late!
  I'm late, but I ditched that addled girl.
  
  There's no place like Uncle Charles' picnic blanket.
  There's no place like Uncle Charles' picnic blanket... but I'd rather be HOME!
  
  */
  </code></pre>