這是問題出現在「C++入門」的§13.3代碼,5天:參數相關查找是在正常範圍查找之前進行的嗎?
void swap(Foo &lhs, Foo &rhs)
{
using std::swap;
swap(lhs.h, rhs.h); // uses the HasPtr version of swap
// swap other members of type Foo
}
書提及具體的類交換不是由使用聲明所隱藏的現象,是指讀者到§18.2.3:
我讀部分和意識到,這可能與參數依賴查找(ADL)。以下是摘錄:
但我仍然對一些認識模糊。我的問題是:ADL是在正常範圍查找之前,還是在正常範圍查找之後?我目前的理解是,ADL在正常範圍查找之前,因爲否則它應該是使用的std :: swap。如果您認爲我是對的,我需要確認;如果您認爲我錯了,請指出我犯了什麼錯誤。謝謝。
謝謝。所以不隱藏的關鍵原因是過載。作者應該提到§18.2.3和§18.2.4。如果std命名空間碰巧有一個交換的HasPtr版本,std :: swap會成功地隱藏在外部範圍中定義的用戶定義的交換,對吧? – user5280911
@ user5280911如果你仍然有原始的重載,那麼這個調用將是不明確的。如果沒有,那麼是的,非模板'sts :: swap'將被調用 – Rakete1111
嗨,Rakete1111,謝謝你的評論。我在這裏發佈了一個後續問題:https://stackoverflow.com/questions/46785093/why-can-an-irrelevant-using-declaration-reconcile-overload-ambiguity-with-argu。你可以看一下嗎?謝謝你們! – user5280911