我正在浏览函数重载的示例,并遇到了以下示例:
#include <string>
#include<iostream>
using namespace std;
enum e1 {a1, b1, c1};
enum e2 {a2, b2, c2 = 0x80000000000 };
string format (int){
cout<<1;
}
string format (unsigned int){
cout<<2;
}
int main () {
format (a1);
format (a2);
return 0;
}
使用gcc 5.4.0,format(a1)
编译并调用format(int)
(显示1作为输出)。但是,编译format(a2)
时,会出现以下错误:
call of overloaded 'format(e2)' is ambiguous
format(a2)
和format(a1)
不应该有相同的输出/错误吗?
答案 0 :(得分:1)
enum e2 {a2, b2, c2 = 0x80000000000 };
文字0x80000000000
的类型为long
。常规enum
(不是enum class
)的基础类型足以容纳其所有值 7.2 [dcl.enum] ,因此e2
必须至少long
。
另一方面,e1
的值都适合int
/ unsigned int
,因此其基础类型必须是其中之一。
I tested it on godbolt时,e1
的基础类型为unsigned int
,基础类型e2
为unsigned long
。因此,在调用函数时,format(a1)
明确地调用unsigned int
版本,但format(a2)
现在必须从unsigned long
转换,因此不清楚调用哪个函数。