c++ - 重载二义性问题
PHPz
PHPz 2017-04-17 15:37:14
0
1
866
void f(void*)
{
    cout << 1;
}

void f(int)
{
    cout << 2;
}

int main()
{
    
    f(0);

    return 0;
}

上述代码在C++编译器中是否会报二义性,我的vs2015没有,是不是跟编译器有关?

PHPz
PHPz

学习是最好的投资!

모든 응답(1)
黄舟

함수 호출 문은 컴파일 타임에 함수 일치를 찾습니다. 함수 일치에는 최적 일치, 일치 없음, 모호한 일치라는 세 가지 결과가 있습니다.

위 코드에서 f(0)은 가장 잘 일치하는 f(int)를 찾게 되며, 모호한 일치 오류가 표시되지 않습니다.

gcc에서 f(NULL)는 모호한 일치 오류를 보고합니다. NULL은 __null로 정의되므로 void*에 대한 경로는 int에 대한 경로만큼 길기 때문에 Windows에서는 모호한 일치, NULL로 간주됩니다. 는 바로 0이므로 오류가 보고되지 않습니다. 이로 인해 템플릿을 다시 로드할 때

과 같은 특히 이상한 현상이 발생합니다. 으아악

f(0)의 가장 잘 일치하는 것은 f(int)이므로 f(int) 함수를 정의하고 오버로드된 함수 f(void)도 정의하는 경우 f(void)를 호출합니다. 올바른 접근 방식은 f(nullptr)이며, nullptr은 이 문제를 해결하기 위해 C 11에서 특별히 사용됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿