9
在下面的C++代碼中,首先爲單個double
參數定義foobar
,然後再爲單個參數Foo
類型定義一個參數。兩者都在全局命名空間內定義。從另一個命名空間訪問C++全局命名空間
在one
名稱空間內,定義了foobar
的進一步重載,其中有Bar
類型的單個參數。從foobar
的這個版本中,帶double
參數(42.0)的foobar
的非限定調用將失敗。類似的調用foobar
,這次用(::)作用域分辨率運算符進行限定,也有一個double
的參數,但會成功。
另一方面,對foobar
的非保留調用(具有類型Foo
的參數)成功。調用foobar
並使用Foo
參數(由範圍解析運算符進行限定)也會成功。
爲什麼這兩種情況的行爲有所不同?我使用gcc 4.7和clang ++ 3.2。
struct Foo {};
struct Bar {};
double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }
namespace one {
Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);
Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};
作爲最後一句的補充:非限定名稱查找只要找到匹配的*名稱就停止,首先考慮本地範圍,並且只有當它沒有找到任何名稱時,它纔會搜索上層和全局範圍。 – Xeo 2012-08-08 22:09:23
謝謝博。與ADL的鏈接使事情變得清晰。 – user2023370 2012-08-08 22:18:39
@Xeo:這是否意味着在找到foobar(Bar b)'後,調用foobar(f)'會失敗? – user2023370 2012-08-08 22:39:55