当指定-Wc++11-narrowing时,下面的代码使clang失败
#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中的代码相同)
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,然后希望显式地缩小范围。
有人能解释一下为什么会这样吗?谢谢!
发布于 2022-02-21 01:33:06
条件表达式的第二个操作数具有uint8_t类型。第三个操作数,文字2,有int类型。
当条件表达式的第二和第三个操作数是不同的算术类型时,执行通常的算术转换,以便将它们转换成它们的公共类型。[expr.cond]/7.2
在这种情况下,通常的算术转换涉及两种类型的提升,即uint8_t和int。[expr.arith.conv]/1.5
因为int可以表示uint8_t类型的所有值,所以uint8_t推广的结果是int。int不受整体促销的影响,仍然是int。[conv.prom]
条件表达式的结果类型为int。从int到uint8_t的转换正在缩小,因为uint8_t不能表示int类型的所有值。
https://stackoverflow.com/questions/71200268
复制相似问题