2017-10-11 107 views
9

在下面的代码,我曾与long long类型定义的unscoped enumeration。此程序在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)

虽然Var转换为int它需要一个更integral conversion(从long longint)。 积分促销具有overload resolution积分转换较高的排名:

2)促进:积分推广,浮点促进

3)转化率:积分转换,浮点转换, 浮动整数转换,指针转换,指向成员 转换,布尔转换,派生类 类到其基的用户定义转换

然后fun(long long ll)应该更好匹配。


Here的gcc错误报告;它已于2017-10-24修复。 LIVE