2013-02-21 64 views
0

考慮以下C++ 11方案:使用命名空間標準,然後包括提升?

#include <stdhdr1> 
#include <stdhdr2> 
#include <stdhdr3> 

using namespace std; 

#include <boost1> 
#include <boost2> 
#include <boost3> 

int main() 
{ 
} 

stdhdrn是一個標準庫的頭,和boostn是升壓報頭。

有沒有這種情況下,這不會編譯?

此外,如果在main中添加了一些額外的用戶代碼,是否會打開無法通過顯式限定含糊(或錯誤)實體來解決的std名稱空間導致的歧義(或其他錯誤)?

(例如,由於ADL的考慮開放STD命名空間或以其他方式?)

(換句話說,可以提高第一把手包含開放std名字空間後?)

+0

顯然,它的確提出了一個問題:爲什麼不在boost包含之後放置'using namespace'呢? – nneonneo 2013-02-21 19:26:10

+13

爲什麼不刪除'使用命名空間標準;'完全忘了它? – GManNickG 2013-02-21 19:26:16

+4

簡單的答案,根本不用'命名空間'。 – 111111 2013-02-21 19:27:14

回答

4

我不相信有會是一個問題,因爲std不包含名爲boost的名稱空間,所以仍然不會有任何名稱衝突。

至於ADL:ADL只考慮類類型的封閉名稱空間。 ADL爲boost類型提供的任何函數都必須位於boost名稱空間內。

只需對標準庫實體執行::std_entity並對提升實體執行boost::boost_entity,您將能夠解析所有實體。

但是,我想不出明確地嘗試證明這一點的好方法。當然,避免任何問題的可靠方法是不要做using namespace std;,如果你真的必須(你不這樣做),只有在所有包含物之後才能做到這一點。