g++不同版本stdint类型与原生类型等价性是否有变化?是g++ bug吗?
问题解答
核心规则说明
首先明确:C++标准从正式纳入<cstdint>到最新版本,从未修改过固定宽度整数类型的定义规则:所有intN_t/uintN_t这类类型,都是对应原生整数类型的typedef别名,本身不会创建新的独立类型,仅保证符合指定的存储宽度和符号要求。
GCC版本行为差异原因
你遇到的是GCC 8.3版本针对32位ARM架构的<cstdint>实现bug,该问题在GCC 9.x版本已经修复:
- G++ 8.3错误地将
int64_t标记为与long、long long都不同的类型,才会出现两个不符合标准的现象:- 同时存在
write(long)和write(int64_t)重载时不会报冲突 - 删除
write(long)重载后,传入long类型参数提示无匹配重载
- 同时存在
- G++ 9.4的行为符合标准要求:如果当前32位ARM编译配置下
long和int64_t映射到同一个原生类型,两个重载必然会因为重定义触发编译错误;如果二者映射到不同原生类型,删除write(long)后会按照隐式转换优先级匹配到最合适的重载,不会报无匹配。
其他类型等价性说明
char、int8_t、uint8_t的关系char本身是独立的内置类型,与signed char、unsigned char属于完全不同的类型,和char本身是否带符号无关。
主流平台下int8_t是signed char的typedef别名,uint8_t是unsigned char的typedef别名,不属于独立类型,无法和对应的带符号/无符号char类型区分重载。如果需要独立的8位整数类型,需要自行通过强类型包装类实现。wchar_t的特殊规则wchar_t从C++98标准开始就被定义为独立的内置类型,不属于任何其他整数类型的别名,因此即便和uint16_t/int16_t宽度相同,也属于不同类型,可以区分重载。
内容的提问来源于stack exchange,提问作者Robin Davies
相关产品推荐
相关产品推荐

