2011-04-01 25 views
3

我知道using std::swap的技巧,通過ADL啓用用戶定義的swap函數,但我並不知道這應該也應用於其他一些函數。比如我在模板代碼編寫濫用std::abs wheras我應該用這樣的:「使用」的候選標準函數

template <class Int> void f(Int i) { 
    using std::abs; 
    Int j = abs(i); 
    // ... 
} 

你能想到什麼標準功能,應使用這種方式?

在一個側面說明:包括cstdlib當G ++把abs在全局命名空間(實際上ctsdlib包括stdlib.h(其定義功能abs),並做了#undef abs ...),並在標準說什麼?

+1

目前的標準說''應該只提供命名空間內的函數。新的C++ 11標準將允許g ++(和大多數其他編譯器)已經做的事情。 – 2011-04-01 09:40:21

回答

1

這是從標準:

3.4.6 using指令和命名空間別名
[basic.lookup.udir]
當在查找一個命名空間名稱使用指示符或 namespace-alias-definition,只考慮命名空間 名稱。

因此,您可以使用關鍵字using將變量,類型和函數導入當前名稱空間。


編輯

您可以導入任何你喜歡到當前的命名空間,但你應該關心的命名空間polution,因此儘量不要在頭使用using,但只在源文件中。

理想情況下,您不應該使用此關鍵字。我有時使用它,當我有深層嵌套的命名空間。

+0

這回答什麼可以導入使用'使用',而不是什麼 – 2011-04-01 09:19:11

+0

@jk正確的,因爲這取決於個人喜好和編碼標準。無論如何,我擴展我的答案 – 2011-04-01 09:24:07

+0

爲'std :: abs'示例,它不是我喜歡導入它,但我_have to_(除非存在另一種解決方案?)爲了我的代碼編譯與類似於整型的類型,對於std庫是未知的,但它們提供它們自己的'abs'版本。 – rafak 2011-04-01 10:14:39