2013-02-23 92 views
0

爲什麼使用向量類我應該編寫名稱空間說明符std::vectorstd::find函數我可以省略std::?有什麼不同?兩者都是在std命名空間中定義的,對嗎?C++:類和函數的名稱空間說明符

+0

這裏的內容是什麼?示例源代碼? – Cornstalks 2013-02-23 21:07:19

回答

4

爲什麼使用Vector類我應該寫名字空間說明符的std ::向量但對於標準::發現功能我可以省略std ::?

一般情況下,這是不正確的。

有什麼區別。兩者都是在std命名空間中定義的,對嗎?

是的,並且在原則上沒有什麼區別。每款C++ 11標準的17.6.1.1/2:

所有圖書館的實體,除了宏,新的運營商和operator delete的命名空間std或命名空間的嵌套命名std內內定義。 [...]

但是,你必須記住,異常是由Argument-Dependent Lookup規則允許:感謝這個查詢技術,它是沒有必要明確指定一個函數的命名空間,因爲名稱將在您提供給該函數的參數的命名空間中查找。

因此,如果功能發生在相同的命名空間的任何參數來定義,它將由編譯器發現,儘管它的名字不與空間限定它屬於:

namespace N 
{ 
    struct X { }; 

    void foo(X) { } 
} 

int main() 
{ 
    N::X x; 
    foo(x); // OK 
} 

因此,如果您正在調用std::find()一些論點是在std命名空間中定義的類型的情況下,你會不會需要調用資格find()std::。例如:

#include <vector> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::vector<int> v { 1, 2, 3 }; 
    auto i = find(v.begin(), v.end(), 2); // ADL applies if the result of 
              // v.begin() and v.end() is an 
              // iterator whose type is defined 
              // in the std namespace! 
    std::cout << *i; 
} 

顯然,這不能適用於接受沒有參數的函數。在這種情況下,名稱空間限定始終是必要的,當然,除非調用的一點是,命名空間中(雖然你不能任何添加到std命名空間,從std命名一些模板可以專門)。

0
你包括LIBRAIRIE你的程序的啓動(STD命名空間)

然後afther你不需要使用所有的時間STD字 但在實際所有的對象都是這樣的std ::法院給std :: cin

STD是C++

soorry,我的英語需要校正的基本LIBRAIRIE之一;)

1

這取決於您如何撥打std::find ...例如,如果你從std容器傳遞了一些迭代器,這個函數將被ADL找到,否則你必須添加std::來調用它。

0

由於某些原因,STL選擇在全局名稱空間中公開許多算法(in)。這就是爲什麼你可以寫查找(...)或變換(...)。載體未曝光,因此您必須執行std::vector<>()。或者您可以在文件頂部使用std::vector;

+0

這是不正確的。從C++標準(17.6.1.1/2)開始:「*除宏,運算符new和運算符delete之外的所有庫實體都在命名空間std中定義或名稱空間中嵌套命名空間std * – 2013-02-23 21:19:51