编译器在具有相同名称的函数上选择仿函数

时间:2013-10-21 01:12:08

标签: c++ function functor

有人可以解释一下哪个规则确定编译器调用下面的仿函数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()不是重载,所以我猜这是在重载解析之外发生的。

1 个答案:

答案 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
}