It recently came to my attention成員函數完全影子在課堂內部具有相同名稱的自由函數。完全意味着每個具有相同名稱的自由函數都不考慮重載分辨率。我可以理解爲什麼它與somwthing這樣做:爲什麼類成員函數使用相同的名字來映射自由函數?
void f();
struct S
{
void f();
void g()
{
f(); // calls S::f instead of ::f
}
};
其中函數具有相同的特徵,其只是自然的,因爲變量的作用域的工作方式相同。但是,爲什麼禁止unambigious調用其中免費功能具有不同的簽名是這樣的:
void f();
struct S
{
void f(int x);
void g()
{
f(); // fails to compile attempting to call S::f, which has wrong signature
}
};
我不問如何調用從類中的陰影免費功能。我想知道的是這個設計背後的基本原理。
您可能需要問問Bjarne Stroustrup! – peacemaker 2012-07-27 21:47:30
像這樣搜索意味着生成的候選函數列表總是很小。這對於編譯時間很有用,你可以想象它是否搜索了所有可能的候選(包括ADL),並且有很多模板,它很快就會變得非常慢。它也反映了大多數情況下的使用情況和期望的語義。通常當你說'foo'時,你想到的'foo'是最接近的。如果它不是最接近的那個,它很可能只是犯了一個錯誤。一個錯誤比運行時發生的奇怪東西更好。保持本地事物是良好的行爲。 – Flexo 2012-07-27 21:48:34
您可以在名稱查詢中欣賞此演示文稿:http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of -n – MFH 2012-07-27 21:50:07