更新:2007 年 11 月
Visual C++ 编译器中现在已完全实现了 Koenig 查找。
有关更多信息,请参见Argument Dependent Name (AKA Koenig) Lookup on Functions。
示例
与在 Visual Studio .NET 2003 中相比,以下示例在 Visual Studio .NET 中运行时行为有所不同
// bc_argument_dependent_AKA_Koenig_lookup_now_supported.cpp
// compile with: /W1
#include <stdio.h>
namespace N {
class X {};
void f(X *pX) {
printf_s("in N::X::f\n");
}; // called if compiled with 7.1
}
void f(void *pv) {
printf_s("in ::f\n");
}; // called if compiled with 7.0
int main() {
N::X *pX = 0;
f(pX);
// The following lines will result in the same behavior
// in Visual Studio .NET or Visual Studio .NET 2003
f((void*)pX); // Cast pX to void before calling f; calls global f
::f(pX); // Explicitly specify global f
N::f(pX); // Explicitly specify f in namespace
}
in N::X::f
in ::f
in ::f
in N::X::f