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

C++ basic type demotion when returning from a function

我得到了(预期的)

warning: large integer implicitly truncated to unsigned type [-Woverflow]

Get2() 但不在 Get1()。我很困惑为什么:

#include <stdint.h>

uint8_t Get1()
{
      return uint8_t(uint64_t(10000));
}

uint8_t Get2()
{
     return uint64_t(10000);
}

int main()
{
     return 0;
}

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

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

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

只是添加到 by Mr Jefffrey,

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

If a return statement with an expression is executed, the value of the expression is returned to the caller as the value of the function call expression. If the expression has a type different from the return type of the function in which it appears, the value is converted as if by assignment to an object having the return type of the function.

Get1() 的情况下,由于显式转换,最终表达式类型为 uint8_t,与函数的 return 类型匹配。

Get2() 的情况下,最终表达式类型是 uint64_t,这与函数的 return 类型 uint8_t 不匹配。

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