2010-08-30 51 views
23

標準不允許這樣的代碼:C++中不允許嵌套名稱空間聲明的具體原因嗎?

namespace Hello::World { 

//Things that are in namespace Hello::World 

} 

,而是需要

namespace Hello { namespace World { 

//Things that are in namespace Hello::World 

}} 

是什麼道理呢?這在當時根本沒有想到,還是有沒有包含它的特定原因?

看起來第一個語法更直接地表達了其中應該是哪個名稱空間,因爲該聲明模仿了後面代碼中名稱空間的實際使用。如果您不幸使用「啞」支架計數壓痕工具,它也會導致較少的縮進。

+0

我的一個想法就是這類的班級裏面的東西似的聲明。我想知道是否會有一些奇怪的角落指定一個類命名空間與命名空間命名空間,這將會被您提出的語法所破壞。 – Omnifarious 2010-08-30 19:22:54

+0

[C++中的多個名稱空間聲明]可能的重複(http://stackoverflow.com/questions/3589204/multiple-namespace-declaration-in-c) – AnT 2010-08-30 19:25:57

+10

@AndreyT:我不問它是否合法,我知道這是非法的。我問**爲什麼**這是非法的。 – 2010-08-30 19:26:46

回答

23

原因很可能是「因爲這就是語言的演化過程。」

至少有一個提案(2003年的"Nested Namespace Definition Proposal")允許嵌套的名稱空間定義,但未被選中包含在C++ 0x中。

+3

+1指出提案 - 我沒有意識到這一點。 – 2010-08-30 19:30:58

+1

在回顧了這個建議並思考了一下之後,我認爲你幾乎肯定是對的。我敢打賭,它並沒有被選中,僅僅是因爲擬議的好處似乎不值得通過標準化過程獲得提案的麻煩。 – Omnifarious 2010-08-30 19:38:54

+0

接受upvotes數量最多的答案,因爲我顯然無法在這裏推測出真正的答案。 – 2010-08-30 21:46:40

2

當我在「可能重複」跟帖說,在C++ 限定名被保留用於參考之前聲明實體。這適用於合格名稱的「來源」:類和名稱空間。

+0

「確切重複」意思是「這個問題與另一個問題完全相同」,而不是「有一個答案適用於這兩個問題」。但對此答案+1。 – 2010-08-30 19:30:39

+4

我不認爲這足以解釋它。你可以預先聲明命名空間,但是你仍然不能使用這個構造。 – 2010-08-30 20:06:10

+0

那麼,你是爲了這個建議還是反對呢?我認爲比利打算命名空間是以前宣佈的...... – Potatoswatter 2010-08-30 20:16:22

11

我相信你寧願希望它是如此,鑑於namespace X::Y,應該是相當於「命名X {命名空間Y`其中它的表面上聽起來不錯,但考慮極端情況:

namespace Hello { 
    namespace { 
     namespace World {} 
    } 
} 

// Does this refer to an existing namespace? Or does it define a new one? 
namespace Hello::World {} 
+0

+1指出我甚至不知道的東西是合法的:) – 2010-08-30 19:37:46

+6

這將是一個不同的命名空間。 'namespace Hello :: World {}'只是'namespace Hello {namespace World {}}'的縮寫,它已經被語言所允許。 – 2010-08-30 19:37:51

+1

@James - 所以基本上沒有辦法用嵌套的語法來引用匿名命名空間?這對我來說似乎很合理,因爲實際上沒有辦法以任何其他方式直接引用匿名名稱空間。 – Omnifarious 2010-08-30 19:41:14

0

我認爲這是一個設計選擇

第一語法看起來不錯,我希望有太然而,第二個是更有條理,你無需創建嵌套的命名空間這樣:

Hello::World::Everyone::Great { 

} 

你會事先聲明嗎?

+1

是的,我寧願有更多的軟件組件分類。像Java和C#這樣的語言都允許使用這種語法,並且它對它們來說工作得很好。它們都附帶非常大的標準庫,並且用於將事物分類到命名空間的層次結構使得查找所需組件變得更容易。 – 2010-08-30 20:00:33

12

嵌套命名空間定義是C++ 17工作草案的一部分。
提案中提到此主題,作爲程序員的需求原始n4026更新版本:n4230此功能的示例。

當前最新的草案:n4567(第7.3.1項10)

7.3.1命名空間定義
...
嵌套名稱空間定義與一個封閉的命名空間說明符E,標識符I和命名空間體B相當於namespace E { namespace I { B } }

namespace A::B::C { 
    int i; 
} The above has the same effect as: 

namespace A { 
    namespace B { 
    namespace C { 
     int i; 
    } 
    } 
} 

編譯器支持

GCC自version 6啓用使用-std=c++1z
的Visual C++,因爲2015 update 3使使用/std:c++latest
鏘因爲version 3.6能夠使用這個-std=c++1z