在使用重载函数定义编译C ++时,为什么有符号和无符号整数类型之间的促销行为不同?这是预期的行为吗?
在下面的示例中,对"的调用失败"在主要是模糊的,但呼吁"传递"不是。
unsigned int fail(unsigned int a) {
return a;
}
unsigned int fail(unsigned short a) {
return a;
}
int pass(int a) {
return a;
}
int pass(short a) {
return a;
}
int main(){
unsigned char a;
char b;
fail(a);
pass(b);
return 0;
}
示例输出(来自clang,VS编译器提供类似的东西):
fail.cpp:22:3: error: call to 'fail' is ambiguous
fail(a);
^~~~
fail.cpp:1:14: note: candidate function
unsigned int fail(unsigned int a) {
^
fail.cpp:5:14: note: candidate function
unsigned int fail(unsigned short a) {
^
1 error generated.
答案 0 :(得分:5)
根据integral promotion(强调我的):
以下隐式转化归类为整体促销:
signed char
[...]可以转换为int
;unsigned char
[...]如果可以保留其整个值范围,则可以转换为int
,否则可以转换为unsigned int
;char
可以转换为int
或unsigned int
,具体取决于基础类型:signed char
或unsigned char
(见上文);请注意,所有其他转化都不是促销活动;例如,重载决策选择
char
- >int
上的char
(促销) - >short
(转化)。
在您的情况下,假设int
能够保持signed char
和unsigned char
的整个值范围,则只有int pass(int a)
是促销,其余三个是转换,转换中没有偏好。
答案 1 :(得分:2)
那些implicit conversions
确实遵循不同的规则。
char
- > int
是促销
char
- > short
是转化
并且选择促销而不是转换,因为它禁止任何精度损失。这就是pass
通过的原因。
尽管
unsigned char
- > unsigned int
仅在int
无法代表unsigned char
所有值的全部范围时才会推广;如果没有,促销活动为unsigned char
- > int
。 我怀疑,在您的情况下,int
确实可以代表unsigned char
范围内的所有值。这意味着fail
可以选择两个两步转换路径:unsigned char
- > int
- > unsigned int
和unsigned char
- > int
- > unsigned short
并且无法在它们之间做出决定。
来源:http://en.cppreference.com/w/cpp/language/implicit_conversion