C++26中是否允许TemplatePack<>...[I]这类包索引语法?
C++26 Pack Indexing:两种写法的合法性分析
Pack Indexing(包索引)是C++26新增的元编程特性,能直接索引类型/值包的元素,替代之前的各种变通实现。它的核心语法是:
typedef-name ... [ expression ]
其中typedef-name可以是标识符(identifier)或者简单模板ID(simple-template-id)。针对你给出的两种写法,分析如下:
写法#1:apply_t<Args>...[0]
template <typename> using apply_t = bool; template <typename... Args> using A = apply_t<Args>...[0];
这个写法是合法的:
apply_t<Args>属于simple-template-id,完全符合typedef-name的定义;apply_t<Args>...会展开成一个由bool组成的类型包(每个apply_t<Args>实例化后都是bool);- 最后通过
[0]索引这个包的第一个元素,完全匹配包索引的语法规则。
你提到的改写形式apply_t<Args...[0]>同样合法,本质是先索引Args包取第一个类型,再传入apply_t实例化,和原写法效果一致,但属于不同的语法路径。
写法#2:Temps<>...[0]
template <template <typename...> typename... Temps> using B = Temps<>...[0];
这个写法同样合法:
Temps<>是simple-template-id(模板名+空模板实参列表),属于typedef-name范畴;Temps<>...展开成一个由各模板实例化后的类型组成的包;[0]索引该包的第一个元素,符合语法要求。
你提到的Temps...[0]<>确实不被允许,因为Temps...是模板模板参数包(模板的集合),而非类型包,当前C++26的包索引仅支持类型包或值包的索引,不能直接对模板包做索引。必须先将模板实例化为类型(比如Temps<>),形成类型包后再使用索引语法。
内容的提问来源于stack exchange,提问作者Desmond Gold
相关产品推荐
相关产品推荐

