我以为我非常了解名称查找(在观看了几个有关它的视频并阅读了很多内容之后),但我只是遇到了这种情况:
#include <iostream>
namespace test{
struct Id
{};
void do_something( const Id& ){ std::cout << "Hello, World!" << std::endl; }
class Test
{
public:
void do_something() { std::cout << "WTF!" << std::endl; }
void run()
{
Id id;
do_something( id ); // doesn't compile
}
};
}
int main()
{
test::Test my_test;
my_test.run();
}
指出的行不编译(在 GCC4.8 和 VC11U2 上),因为它尝试使用成员函数 test::Test::do_something()
而不是名称空间范围test::do_something( const Id& )
,这似乎是唯一可能的候选者。
显然,成员函数名称隐藏了命名空间范围的名称,这让我感到惊讶,因为我记得在其他上下文中使用几乎相似的代码而没有产生这个问题(但最终条件可能会非常不同)。
我的问题是:这些编译器是否符合标准?
(不幸的是,通过阅读标准文档很难理解名称查找,所以我需要专家确认)