C++20中哪条规范禁止不带括号的sizeof...T用法?
g++ 和 clang++ 编译器均会拒绝参数未加括号的sizeof...用法,例如下方代码无法通过编译:
template<typename... T> auto packsize = sizeof...T;
对应的编译报错信息如下:
$ g++ -std=c++20 -ggdb -O -Wall -Werror -c -o z.o z.cc z.cc:1:50: error: 'sizeof...' argument must be surrounded by parentheses [-fpermissive] 1 | template<typename... T> auto packsize = sizeof...T; | ^ $ clang++ -std=c++20 -ggdb -O -Wall -Werror -c -o z.o z.cc z.cc:1:50: error: missing parentheses around the size of parameter pack 'T' template<typename... T> auto packsize = sizeof...T; ^ () 1 error generated.
通用C语法参考文档同样要求sizeof...后的参数包T必须被括号包裹,但该限制并未出现在C20标准的显性语义相关章节中:无论是sizeof...运算符的语义说明章节,还是可变参数模板的包展开规则说明章节,都没有明确提及该强制要求,仅标准中所有非规范性示例都使用了带括号的写法。
禁止无括号写法的规范性条款实际来自C标准的语法定义部分:
C20标准中sizeof...表达式的语法产生式被明确定义为:
sizeof... ( identifier )
语法规则本身属于规范性强制约束,也就是说sizeof...后面必须紧跟被括号包裹的参数包标识符,根本不存在省略括号的合法语法形式。之所以在专门的语义说明章节找不到对应描述,是因为括号要求属于语法层面的解析规则,不属于后续语义约束的范畴,自然不会放在语义说明部分。所有遵循C++标准的编译器都必须按照官方定义的语法规则解析代码,未加括号的sizeof...T写法从语法层面就不合法,会被直接判定为编译错误。
内容的提问来源于stack exchange,提问作者user3188445
相关产品推荐
相关产品推荐

