2011-07-22 47 views
13

有人可以給我解釋一下下面的命名慣例之間的差別領先::平均:什麼在C 「使用命名空間:: X」 ++

using namespace ::layer::module;

using namespace layer::module;

什麼原因導致在layer之前增加::

+2

這是http://stackoverflow.com/q/4925394/498253 – Tom

+0

@Tom的重複:但是,這確實是一個確切的愚蠢? – sbi

+1

@sbi:是的,'什麼是prepending ::是什麼意思 - 爲什麼它被使用?但由於這裏有更多的答案比我沒有關閉 - 我只是認爲該鏈接將有所幫助 – Tom

回答

21

會有區別,如果它是在一個上下文中使用,例如:

namespace layer { 
    namespace module { 
     int x; 
    } 
} 

namespace nest { 
    namespace layer { 
     namespace module { 
      int x; 
     } 
    } 
    using namespace /*::*/layer::module; 
} 

在初始::第一x將是使用指令之後可見的,沒有它裏面nest::layer::module第二x將是變得可見。

+0

+1爲好的答案 –

13

第二種情況可能是X::layer::module其中using namespace X已經發生。

在第一種情況下,前綴::的意思是「編譯器,不要聰明,從全球名稱空間開始」。

11

領先::全局命名空間。任何以::開頭的合格標識符將始終引用全局名稱空間中的某個標識符。所不同的是,當你有同樣的東西,在全球以及在一些地方命名空間:

namespace layer { namespace module { 
    void f(); 
} } 

namespace blah { 
    namespace layer { namespace module { 
     void f(); 
    } } 

    using namespace layer::module // note: no leading :: 
           // refers to local namespace layer 
    void g() { 
    f(); // calls blah::layer::module::f(); 
    } 
} 

namespace blubb { 
    namespace layer { namespace module { 
     void f(); 
    } } 

    using namespace ::layer::module // note: leading :: 
            // refers to global namespace layer 
    void g() { 
    f(); // calls ::layer::module::f(); 
    } 
} 
3

它被稱爲合格的名稱查找在C++中。

這表示所引用的圖層名稱空間是全局名稱空間之外的名稱空間,而不是另一個名爲layer的嵌套名稱空間。

對於Standerdese球迷:
$ 3.4.3/1

「一類或命名空間成員的名稱可以在::範圍解析運算符(5.1)之後被稱爲施加到嵌套名稱說明符指定其類或名稱空間在:: scope解析運算符之前查找名稱期間,將忽略對象,函數和枚舉器名稱如果找到的名稱不是類名稱(第9節)或命名空間名稱(7.3.1),該程序是不合格的。「