찾다

 >  Q&A  >  본문

c++ - 重载二义性问题

void f(void*)
{
    cout << 1;
}

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

int main()
{
    
    f(0);

    return 0;
}

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

PHPzPHPz2883일 전901

모든 응답(1)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 15:39:14

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

    위 코드에서 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에서 특별히 사용됩니다.

    회신하다
    0
  • 취소회신하다