从函数返回时的C ++基本类型降级

时间:2015-06-19 13:15:26

标签: c++ compiler-warnings type-conversion

我得到了一个(预期的)

  

警告:大整数隐式截断为无符号类型[-Woverflow]

<{1>}上的{p>,但不在Get2()上。我很困惑为什么:

Get1()

这是一些模板化代码的简化版本,可以执行其他操作 - 没有硬编码值。 使用GCC或Clang编译时,C ++中也会发生同样的情况。

2 个答案:

答案 0 :(得分:4)

警告is reported on the Get2 function,因为隐式转换(而不是Get1上的显式转换)发生了,并且编译器警告您整数被截断。

未报告显式的,因为您已明确告知编译器您正在执行截断,因此在这种情况下警告可能是多余的。

答案 1 :(得分:2)

仅由answer先生添加Jefffrey

来自return语句语义,C11,章§6.8.6.4

  

如果执行带有表达式的return语句,则表达式的值将作为函数调用表达式的值返回给调用者。 如果表达式的类型与其出现的函数的返回类型不同,则该值的转换就像分配给具有函数返回类型的对象一样。

对于Get1(),由于显式强制转换,最终表达式类型为uint8_t,它与函数的返回类型相匹配。

如果是Get2(),则最终表达式类型为uint64_t,它与函数的返回类型uint8_t不匹配。

因此,在Get2()的情况下,类型正在转换(就像通过赋值一样)并且由于类型中的mismtach,会产生警告。