2017-10-11 12 views
9

다음 코드에서 unscoped enumerationlong long 유형으로 정의했습니다. 이 프로그램은 Clang에서 정상적으로 작동합니다.GCC : 범위가 지정되지 않은 열거 형으로 인해 모호성 오류가 발생 함

그러나 GCC 컴파일러에서 모호성 오류가 발생합니다.

#include <iostream> 

enum : long long { Var=5 }; 

void fun(long long ll) 
{ 
    std::cout << "long long : " << ll << std::endl; 
} 

void fun(int i) 
{ 
    std::cout << "int : " << i << std::endl; 
} 

int main() 
{ 
    fun(Var); 
} 

GCC 생성 오류 :

main.cpp: In function 'int main()': 
main.cpp:17:12: error: call of overloaded 'fun(<unnamed enum>)' is ambiguous 
    fun(Var); 
      ^
main.cpp:5:6: note: candidate: void fun(long long int) 
void fun(long long ll) 
     ^~~ 
main.cpp:10:6: note: candidate: void fun(int) 
void fun(int i) 
     ^~~ 

왜 GCC 컴파일러는 모호한 오류를 주는가?

답변

12

GCC가 잘못되었습니다. 그 내부 형식으로 변환

범위가 지정되지 않은 열거 타입이 규정 integral promotion로서 :

그 내부 형식 고정되고, (C++ 11 때문에) 그 내부 형식으로 변환 할 수 범위가 지정되지 않은 열거 형

intVar 용으로 변환 동안 하나 이상의 integral conversion (long long에서 int에) 필요하다.

2) 추진 : 적분 촉진 부동 촉진

3) 변환, 적분 변환, 부동 소수점 변환 부동 적분 촉진overload resolution적분 변환보다 높은 순위를 갖는다 -integral 변환, 포인터 변환, 멤버에 대한 포인터 변환, 부울 변환, 파생 된 클래스를 기본으로 사용자 정의 변환

다음 fun(long long ll)가 더 일치해야합니다.


Here 's gcc bug report; 그것은 2017-10-24로 고정되었습니다. LIVE