C++17 fold expression折叠表达式为何在using声明中无括号也可折叠
你遇到的疑问本质是混淆了参数包扩展和折叠表达式两个C++语法特性,二者的适用规则完全不同:
- 折叠表达式是C++17新增的、专门用于对参数包做运算求值的语法,比如计算所有参数的和
(args + ... + 0),这类场景属于表达式运算,所以标准强制要求用括号包裹,明确折叠的运算顺序和边界。 - 你代码里
using Lambdas::operator()...;中的...属于C++11就支持的参数包扩展语法,不需要括号。这种语法的作用是把模板参数包展开为逗号分隔的同位元素,只要当前语法场景允许多个同规则的声明/定义,就可以直接使用。
你给出的代码里还有另外两处相同的参数包扩展写法,逻辑完全一致:
- 继承列表里的
public Lambdas...:展开后就是把所有传入的lambda类型都列为该结构体的基类 - 构造函数初始化列表里的
Lambdas(lambdas)...:展开后就是逐个调用每个基类的构造函数,传入对应的lambda实例完成初始化
而你有疑问的using声明行,展开后等价于依次写了using Lambda1::operator(); using Lambda2::operator(); using Lambda3::operator(); ...,把所有基类lambda的operator()都引入到当前结构体的作用域,这样调用该结构体实例时,重载解析就能匹配到所有lambda的重载版本。
这个写法是C++17中配合std::visit访问std::variant的标准惯用法,完全符合语法规范。
内容的提问来源于stack exchange,提问作者TestUser
相关产品推荐
相关产品推荐

