과부하 해결 중에 함수 개체가 일반 함수와 다르게 처리됩니까? 그렇다면 어떻게? 여기기능 개체가 과부하 해결에 어떻게 영향을 줍니까?
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
template <typename... Args>
void bar(Args&&... args) { std::cout << "global bar\n"; }
int main()
{
bar(N::A);
}
출력은 "N : 바"이다
동등하게 호출 가능한 함수 객체 함수를 대체 여기서 I는 다음의 경우에 실행 된 코드의 의미를 변경. 지금까지는 매우 좋았습니다 : N :: bar는 ADL에 의해 발견되었습니다. N :: bar와 전역 막대가 정확히 일치합니다. N :: bar는 템플릿이 아니기 때문에 선호됩니다.
그러나 나는과 같이, 함수 객체로 글로벌 줄을 변경할 경우 :
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
struct S
{
template <typename... Args>
void operator()(Args&&... args) { std::cout << "global bar\n"; }
};
S bar;
int main()
{
bar(N::A);
}
출력은 이제 "글로벌 바"입니다. 차이점은 무엇입니까?
오늘 나는 David에게 감사 드렸다. – ildjarn
나는 3.4의 노트를 생각하지 않는다.왜냐하면'bar' *는 함수 호출 표현식에서 후치 - 표현식이기 때문입니다 (피연산자로 함수를 가지지 않지만 결국 하나를 호출합니다!). 주석에 따르면 3.4.2는 "x (y)"의 구문상의 의미를 변경하지 않습니다. 함수 호출 인 경우 함수 호출을 무시하고 3.4.2로 결정합니다. –
@ JohannesSchaub-litb : 정규 lookup은'bar'가 객체라는 것을 알게되고'bar (x)'는 그 인스턴스에 대해'operator() '의 적용을 나타냅니다. 연산자의 응용 프로그램은 함수 호출이지만 * 구성원 함수 * 호출이므로 ADL이 적용되지 않습니다. –