Bar*_*uch 3 c++ overload-resolution name-lookup
我认为在嵌套命名空间中,任何属于父(或全局)命名空间的内容都被同等考虑用于重载解析,但此示例似乎另有说明。
这工作正常:
#include <iostream>
void foo(int) { std::cout << "int\n"; }
void foo(float) { std::cout << "float\n"; }
namespace NS {
void bar() {
foo(0);
}
}
int main() {
NS::bar();
}
Run Code Online (Sandbox Code Playgroud)
调用foo(0)匹配,foo(int)因为它是一个更好的匹配,一切都按预期工作。但是,如果我将 的声明移动foo(float)到命名空间中:
#include <iostream>
void foo(int) { std::cout << "int\n"; }
namespace NS {
void foo(float) { std::cout << "float\n"; }
void bar() {
foo(0);
}
}
int main() {
NS::bar();
}
Run Code Online (Sandbox Code Playgroud)
对foo(0)现在的呼吁foo(float)!
我已经搜索过https://en.cppreference.com/w/cpp/language/overload_resolution和许多其他此类页面,以找到解释这一点的规则,但我似乎错过了它。有人可以解释一下许多复杂的重载解析规则中的哪一个会导致这种情况,还是其他原因?
编辑
我刚刚发现它更奇怪。即使foo命名空间内部根本不匹配,它仍然不会使用外部的。这完全无法编译:
#include <iostream>
void foo(int) { std::cout << "int\n"; }
namespace NS {
void foo(float, float) { std::cout << "float\n"; }
void bar() {
foo(0);
}
}
int main() {
NS::bar();
}
Run Code Online (Sandbox Code Playgroud)