C ++使用signed和unsigned int重载不同

时间:2018-04-13 12:49:37

标签: c++

在使用重载函数定义编译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.

2 个答案:

答案 0 :(得分:5)

根据integral promotion(强调我的):

  

以下隐式转化归类为整体促销:

     
      
  • signed char [...]可以转换为int;
  •   
  • unsigned char [...]如果可以保留其整个值范围,则可以转换为int,否则可以转换为unsigned int;
  •   
  • char可以转换为intunsigned int,具体取决于基础类型:signed charunsigned char(见上文);
  •   
     

请注意,所有其他转化都不是促销活动;例如,重载决策选择char - > int上的char(促销) - > short(转化)。

在您的情况下,假设int能够保持signed charunsigned 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 intunsigned char - > int - > unsigned short并且无法在它们之间做出决定。

来源:http://en.cppreference.com/w/cpp/language/implicit_conversion