GCC:Unscoped枚举类型给出了歧义错误

时间:2017-10-11 09:56:24

标签: c++ gcc enums c++14 language-lawyer

在以下代码中,我使用long long类型定义了 unscoped enumeration 。此程序适用于 Clang

但是 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编译器会出现歧义错误?

1 个答案:

答案 0 :(得分:13)

海湾合作委员会错了。

转换为其基础类型的无范围枚举类型被限定为integral promotion

  

其基础类型固定的未作用域枚举类型可以转换为其基础类型,...(从C ++ 11开始)

虽然Var转换为int,但还需要一个integral conversion(从long longint)。 积分促销overload resolution中的排名高于积分转换

  

2)推广:整体推广,浮点推广

     

3)转换:积分转换,浮点转换,   浮点积分转换,指针转换,指向成员的指针   转换,布尔转换,派生的用户定义转换   等级到它的基础

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

Here是gcc错误报告;它被修复在2017-10-24。 LIVE