用Concept指定参数包长度:该代码写法是否合法?
这种C++写法是否符合标准?
结论:不符合C++标准。
这段代码试图通过带概念约束的参数包any<Is> auto...“消耗”前N个实参,让后续的auto n匹配第N+1个实参,但这种写法违反了C++标准中函数模板参数推导的核心规则:
- 标准明确要求,除非是折叠表达式等特殊场景,函数参数列表中的参数包必须作为最后一个元素存在。这里
any<Is> auto...参数包后还跟着auto n和auto...,属于非法的参数包使用方式,无法被标准允许的推导逻辑处理。
编译器表现差异的原因:
- clang 15及以下版本的实现存在宽松处理,误支持了这种不符合标准的写法;
- clang trunk和GCC的最新版本严格遵循C++标准,因此会对该非法写法抛出编译错误。
原代码示例:
#include<utility> using std::size_t; template<typename, size_t> concept any = true; template<size_t N> auto invokeN(auto f, auto... args) { return [&]<size_t... Is>(std::index_sequence<Is...>) { return [&](any<Is> auto..., auto n, auto...) { return f(n); }(args...); }(std::make_index_sequence<N>{}); } auto x = invokeN<2>([](auto x){ return x; }, 42., "420", 4200); // 预期得到4200
内容的提问来源于stack exchange,提问作者Passer By
相关产品推荐
相关产品推荐

