在以下代码中,我使用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编译器会出现歧义错误?
答案 0 :(得分:13)
海湾合作委员会错了。
转换为其基础类型的无范围枚举类型被限定为integral promotion:
其基础类型固定的未作用域枚举类型可以转换为其基础类型,...(从C ++ 11开始)
虽然Var
转换为int
,但还需要一个integral conversion(从long long
到int
)。 积分促销在overload resolution中的排名高于积分转换:
2)推广:整体推广,浮点推广
3)转换:积分转换,浮点转换, 浮点积分转换,指针转换,指向成员的指针 转换,布尔转换,派生的用户定义转换 等级到它的基础
然后fun(long long ll)
应该更好地匹配。