有人可以解释一下哪个规则确定编译器调用下面的仿函数f
而不是函数f
?
#include <iostream>
struct A {
void operator()() { std::cout << "functor" << std::endl; }
};
void f() { std::cout << "function" << std::endl; }
int main()
{
A f;
f(); // Output: functor
}
A::operator()()
和f()
不是重载,所以我猜这是在重载解析之外发生的。
答案 0 :(得分:5)
这是由于名字隐藏。声明f
变量时,它会隐藏f
函数。在该范围中使用名称f
将引用局部变量而不是函数。
如果您想调用函数f
,那么您可以使用scope resolution operator:
#include <iostream>
struct A {
void operator()() { std::cout << "functor" << std::endl; }
};
void f() { std::cout << "function" << std::endl; }
int main()
{
A f;
::f(); // Output: function
}