auto变量初始化代码GCC编译失败的标准符合性问题咨询
问题成因与标准符合性说明
核心原因
该编译差异本质是C++标准对函数式显式转换的语法限制,以及MSVC非标准扩展导致的行为差:
- C++标准明确规定:
类型名(初始化参数)、类型名{初始化参数}格式的函数式转换,仅支持单token组成的类型名。unsigned char是由unsigned、char两个独立token组成的复合类型名,不符合该语法要求,本身属于非标准写法。 - 合法的写法有三种:
- 用括号包裹类型名:
const auto FAV_TEST_VAL = (unsigned char){ '9' }; - 用标准显式转换:
const auto FAV_TEST_VAL = static_cast<unsigned char>('9'); - 提前定义类型别名:
using uchar = unsigned char; const auto FAV_TEST_VAL = uchar{ '9' };
- 用括号包裹类型名:
标准符合性判定
这不属于GCC的标准符合性问题,GCC的报错是严格遵循C++标准的正常行为:
VS2022默认配置下对该语法做了非标准扩展,允许多token类型名直接使用函数式初始化语法,才会让非标准代码编译通过。如果开启MSVC的/permissive-(标准兼容模式)开关,这段代码同样会在VS2022上报错。
内容的提问来源于stack exchange,提问作者EmilyC137
相关产品推荐
相关产品推荐

