2011-07-18 93 views
11

我認爲for_each是在標準名稱空間中定義的,但是這個代碼實際上是編譯並且使用下面的編譯器標誌運行。有人可以解釋爲什麼嗎?爲什麼for_each沒有std ::前綴

//@filename myprog.cpp 
    //g++-4.5 --std=c++0x myprog.cpp 

    #include<iostream> 
    #include<algorithm> 

    int main() 
    { 
    std::vector<int> v{1,2,3,4,5}; 
    std::cout<<"printing the number\n"; 
    for_each(v.begin(),v.end(),[](int num) {//no std::for_each 
     std::cout<<num<<"\t"; 
    }); 
return 0; 
} 
+5

查找ADL - 這個網站上有很多問題(參數依賴查找) – Nim

+0

我在想這不會是可移植的。我知道你只是好奇,但我建議使用'std ::'來保證安全。 –

+0

編譯並運行哪個編譯器和標準庫實現? –

回答

15

將註釋轉換爲答案,其工作原因是ADL(參數依賴查找)。基本上這意味着,如果在當前命名空間中找不到for_each的合適匹配項,編譯器就會有一個內置規則,它說現在查看其他命名空間 - 並且它使用的命名空間的名稱空間是參數。一旦它有一組命名空間,它將搜索它們以找到合適的for_each

問題仍然存在是否std::vector<>::iterator駐留在std::或不。很明顯,在你的實現中它會這樣做,這就是爲什麼找到合適的for_eachstd::。有可能是這種迭代器不在std:: - 爲了安全起見(如艾倫的評論),總是養成與std::排位賽的習慣。

此外,這樣可以防止任何其他人將另一個for_each(出於參數的原因)引入您的名稱空間 - 這可能會破壞事情(在更糟的情況下 - 默默接受 - 但在運行時會中斷)。

+0

感謝您的回答 –

+0

+1,因爲我幾個星期前才發現它,它仍令我驚歎;另外:這種功能的原因之一是允許自由函數操作符工作而不必指定任何名稱空間。 「 – Klaim

+2

」在默認名稱空間中找不到合適的匹配項「?我不認爲ADL是這樣工作的。如果「默認命名空間」會隱藏關聯的命名空間,那麼在命名空間中重載時會遇到問題。什麼是默認的命名空間呢?你的意思是現在嗎? – MSalters

相關問題