首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么原因导致这段代码触发隐式int收缩?

是什么原因导致这段代码触发隐式int收缩?
EN

Stack Overflow用户
提问于 2022-02-21 01:25:36
回答 1查看 58关注 0票数 1

当指定-Wc++11-narrowing时,下面的代码使clang失败

代码语言:javascript
复制
#include <stdint.h>

extern uint8_t numbers[];
extern int n;

uint8_t test(int num) {
    uint8_t a{n > 0 ? *numbers : 2};
    return a;
}

(https://godbolt.org/z/nTKqT7WGd中的代码相同)

代码语言:javascript
复制
8:15: error: non-constant-expression cannot be narrowed from type 'int' to 'uint8_t' (aka 'unsigned char') in initializer list [-Wc++11-narrowing]
    uint8_t a{n > 0 ? *numbers : 2};

我阅读了标准和相关的问题,但我无法理解为什么有两个结果为uint8_t或可以透明地缩小uint8_t(即常数2)的三元操作导致晋升到int,然后希望显式地缩小范围。

有人能解释一下为什么会这样吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-21 01:33:06

条件表达式的第二个操作数具有uint8_t类型。第三个操作数,文字2,有int类型。

当条件表达式的第二和第三个操作数是不同的算术类型时,执行通常的算术转换,以便将它们转换成它们的公共类型。[expr.cond]/7.2

在这种情况下,通常的算术转换涉及两种类型的提升,即uint8_tint[expr.arith.conv]/1.5

因为int可以表示uint8_t类型的所有值,所以uint8_t推广的结果是intint不受整体促销的影响,仍然是int[conv.prom]

条件表达式的结果类型为int。从intuint8_t的转换正在缩小,因为uint8_t不能表示int类型的所有值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71200268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档