有一個(當然,有些少見)情況,即你使用真正的形式可以有所作爲,而且要使用形式爲using namespace foo
,它的最普遍應用於std
命名空間(也就是說,你寫using namespace std;
。
最明顯的例子是,你寫一個排序的用戶定義類型,它是可能,這將被應用到該用戶還定義了一個類型的擁有swap
。
如果用戶想要使用swap,如果他們已經定義了swap,就會陷入困境,但如果他們沒有定義,則使用std :: swap。如果您在代碼中直接使用std::swap
,那麼即使類型具有自己定義的交換,您也將最終使用std::swap
。相反,如果您直接爲該類型指定一個交換,並且沒有提供交換,則代碼將無法編譯。
要解決這個問題,你做這樣的事情:
using namespace std;
template <class Iter>
void my_sort(Iter first, Iter last) {
// ...
if (*last < *first)
swap(*first, *last);
}
這將找到交換專門針對類型進行比較(即,在同一個命名空間作爲類型定義的swap
),如果有一個(通過依賴於參數的查找)和std::swap
(如果沒有爲該類型定義)(通過using namespace std;
)。
這可能會對性能產生影響 - 如果他們專門爲它們的類型編寫了交換,那麼通常可以預期這是因爲通過這樣做,它們可以提供更好的性能。這意味着明確指定std::swap
可能會起作用,但可能會導致性能下降。 (除了上面的情況,我在寫代碼的時候),我更喜歡給出全名(例如,std::swap
)至少有兩種可能性可能是首選,我想給編譯器足夠的餘地來選擇正確的。
另一次我發現使用有用的聲明/指令時,命名空間得到真正深層嵌套。 Boost(對於一個明顯的例子)有一些名稱,如果您每次使用完全限定的名稱,那麼這些名稱會太方便使用。對於(現在感謝,主要是過時的)Boost Lambda庫來說尤其如此,在這裏你使用了像_1
這樣的佔位符,它最終會像boost::lambda::placeholders::_1
一樣(但是我要從內存中去掉,所以這可能至少部分是錯誤的)如果你堅持使用完全合格的名字。這將首先破壞使用lambda庫的大部分目的。
它與運行時性能無關。 –
我在大學時被告知,除了範圍內的所有名稱空間外,使用'using namespace std;'也是一個安全隱患。 –
1.因爲你描述的原因而氣餒2.幫助你在ADL的幫助下使用他人提供的函數(參見'std :: swap',儘管讓答案更好地向你解釋這一點)3。我最喜歡的,但這是一個味道的問題,如果你不喜歡在所有地方看到「std ::」,那麼可能會很麻煩。但他們都沒有任何性能差異,它們只是名稱解析,並沒有*「編譯成實際的代碼」*。 –