2013-10-21 2 views
2

컴파일러가 함수 f 대신에 functor를 f이라고 부르는 규칙을 설명 할 수 있습니까?컴파일러가 동일한 이름을 가진 함수를 통해 functor를 선택했습니다.

#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()는 오버로드하지, 그래서 내 생각이 오버로드 확인 이외의 일이다.

답변

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 
}