2017-10-11 42 views
9

W poniższym kodzie zdefiniowałem typ unscoped enumeration o numerze long long. Ten program działa dobrze na Clang.GCC: Nieprzypisany typ wyliczenia podaje błąd niejednoznaczności

Ale kompilator GCC podaje błąd niejednoznaczności.

#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 wygenerowany błąd:

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) 
     ^~~ 

Dlaczego GCC kompilator daje błąd niejasności?

Odpowiedz

12

GCC jest błędne.

Unscoped typu wyliczenie konwersji do jego podstawowego typu jest kwalifikowana jako integral promotion:

unscoped typu wyliczenie którego Bazowy typ stałej można przekształcić do jego podstawowego typu, ... (ponieważ C++ 11)

Podczas gdy dla Var konwersji do int wymaga to jeszcze integral conversion (od long long do int). Integral promocja ma wyższą pozycję niż integralna konwersji w overload resolution:

2) Promocja: integralna promocja, zmiennoprzecinkową promocja

3) Konwersja: integralny konwersji zmiennoprzecinkowej konwersji pływającą -integralna konwersja, konwersja wskaźnika, konwersja pointer-to-member , konwersja boolowska, zdefiniowana przez użytkownika konwersja pochodnej klasy do jej bazy

Następnie należy lepiej dopasować fun(long long ll).


Here Raport o błędzie gcc; zostało to naprawione na dzień 2017-10-24. LIVE