Anonymous Namespace Ambiguity

前端 未结 5 2028
我在风中等你
我在风中等你 2020-12-18 19:51

Consider the following snippet:

void Foo() // 1
{
}

namespace
{
  void Foo() // 2
  {
  }
}

int main()
{
  Foo(); // Ambiguous.
  ::Foo(); // Calls the Foo         


        
5条回答
  •  时光说笑
    2020-12-18 20:16

    You can't. The standard contains the following section (§7.3.1.1, C++03):

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

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

    where 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.

    Thus you have no way to refer to that unique name.

    You could however technically use something like the following instead:

    int i;
    
    namespace helper {
        namespace {
            int i;
            int j;
        }
    }
    
    using namespace helper;
    
    void f() { 
        j++; // works
        i++; // still ambigous
        ::i++; // access to global namespace
        helper::i++; // access to unnamed namespace        
    }
    

提交回复
热议问题