编译器警告 - 从函数返回时C++基本类型降级

compiler warnings - C++ basic type demotion when returning from a function

本文关键字:C++ 类型 降级 返回 警告 函数 编译器      更新时间:2023-10-16

我得到了一个(预期的)

警告:大整数隐式截断为无符号类型 [ -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++ 中也会发生同样的情况。

Get2 函数上报告的警告之所以存在,是因为发生了隐式转换(而不是您在 Get1 上的显式转换),并且编译器警告您整数被截断。

未报告显式警告,

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

只是为了补充杰弗里先生的答案,

摘自return语句语义学,C11,第§6.8.6.4

如果执行带有表达式的 return 语句,则表达式的值将作为函数调用表达式的值返回给调用方。如果表达式的类型与它所在的函数的返回类型不同,则值将像通过赋值到具有函数返回类型的对象一样进行转换。

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

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

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