为何我的C++逗号运算符折叠表达式写法出现语法错误?
错误原因分析
你代码里的两处报错分别来自不同的问题:
- 第一行输出代码的语法报错
(std::cout << typeid(Types).name(), ...) ;
这行代码本身完全符合C17的折叠表达式语法规则,属于逗号运算符的一元右折叠,展开后等价于依次执行每个std::cout << typeid(T).name()的调用。你这里报语法错大概率是**没有开启C17及更高版本的编译支持**,需要给编译器加上对应参数,比如GCC/Clang加-std=c++17,MSVC在项目设置里把C语言标准调整为C17或更高。
2. 第二行static_assert折叠的语法报错
(static_assert(std::is_integral_v<Types>, "Type must be integral type"), ...);
这行是根本性的语法错误,和C++版本无关。折叠表达式要求运算符两侧的操作数必须是可求值的表达式,但static_assert是编译期断言声明,不属于表达式范畴,没有返回值,也不能出现在运算符的操作数位置,自然无法放入折叠表达式中配合逗号运算符使用。
正确实现方式
如果你要对参数包中的所有类型做整数类型校验,有两种常用实现方案:
方案1:统一校验(C++17及以上)
直接把类型检查的结果作为折叠表达式的操作数,统一做断言:
static_assert((std::is_integral_v<Types> && ...), "All types must be integral type");
这种方式只要参数包里有一个类型不满足要求就会触发断言,报错信息统一。
方案2:逐个类型单独断言
如果需要每个类型不满足时都触发独立的断言,方便定位错误类型,可以把static_assert放到立即调用的lambda中,把整个lambda调用转为表达式后再做折叠(需要C++20及以上支持模板lambda):
([]<typename T>(){ static_assert(std::is_integral_v<T>, "Type must be integral type"); }.template operator()<Types>(), ...);
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

