2014-09-26 125 views

回答

2

Defect report 373: Lookup on namespace qualified name in using-directive給出爲什麼措詞重要的一個例子:

namespace X { 
    namespace Y { 
    struct X { 
     void f() 
     { 
     using namespace X::Y; 
     namespace Z = X::Y; 
     } 
    }; 
    } 
} 

哪個X被稱爲在using namespace X::Y的結構或命名空間?如果沒有3.4.6中的措詞,這將是不明確的。

這實際上導致從措辭的變化:

當在using指令或命名空間別名定義查找一個命名空間的名字,只有名字空間的考慮。

什麼,我們今天因爲原來的措辭並不包括嵌套名稱符

歧義與嵌套名稱 - 符它,如果我們看一下draft C++11 standard在部分語法5.1.1一般如下:

nested-name-specifier: 
    ::opt type-name :: 
    ::opt namespace-name :: 
    decltype-specifier :: 
    nested-name-specifier identifier :: 
    nested-name-specifier templateopt simple-template-id :: 

和下面的段落中,我贏了」 t拷貝,因爲它們很大,不會限制嵌套名稱說明符名稱空間

至於我可以告訴節7.3.1命名空間定義充分限制命名空間名稱防止歧義。

+0

我在理解歧義方面有些困難。 _using-directive_和_namespace-alias-definition_都引用一個名稱空間,而不是一個類名。 – Mao 2014-09-26 12:33:52

+0

@ChairmanMao更新了問題以澄清。 – 2014-09-26 13:15:52

1

鏘對namespace usingalias directives單元測試是完全回答你的問題:

鐺-CC -fsyntax只-verify%s的

struct ns1 {}; // This is not a namespace, although a namespace has ns1 as a name 
void ns2(); 
int ns3 = 0; 

namespace ns0 { 
    namespace ns1 { 
    struct test0 {}; 
    } 
    namespace ns2 { 
    struct test1 {}; 
    } 
    namespace ns3 { 
    struct test2 {}; 
    } 
} 

using namespace ns0; 

namespace test3 = ns1; // don't get confused 
namespace test4 = ns2; 
namespace test5 = ns3; 

using namespace ns1; // don't get confused 
using namespace ns2; 
using namespace ns3; 

test0 a; 
test1 b; 
test2 c; 

這個問題也一直討論於n3160 defect report

相關問題