§3.4.6/ 1:查找名稱空間名稱時可以考慮的其他名稱與名稱空間名稱不同?
在使用指示符或命名空間的別名定義,在 查找爲一個命名空間名稱或用於在 的名稱嵌套名稱說明符只考慮命名空間名稱。
基本上,我問的是:「爲什麼這段文字是必要的?」
§3.4.6/ 1:查找名稱空間名稱時可以考慮的其他名稱與名稱空間名稱不同?
在使用指示符或命名空間的別名定義,在 查找爲一個命名空間名稱或用於在 的名稱嵌套名稱說明符只考慮命名空間名稱。
基本上,我問的是:「爲什麼這段文字是必要的?」
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
命名空間定義充分限制命名空間名稱防止歧義。
鏘對namespace using
和alias 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
我在理解歧義方面有些困難。 _using-directive_和_namespace-alias-definition_都引用一個名稱空間,而不是一個類名。 – Mao 2014-09-26 12:33:52
@ChairmanMao更新了問題以澄清。 – 2014-09-26 13:15:52