C++可变参数模板参数前能否使用可变concept约束?
在可变参数模板参数之前可以使用可变concept吗?
我想知道如下写法是否符合C++规范:
template <class, std::size_t> concept Any = true; template <class> struct n_ary; template <std::size_t... Is> struct n_ary<std::index_sequence<Is...>> { template <Any<Is>... Ls, typename ... Ts> void operator()(Ls..., Ts...) {} };
当前该写法仅被clang编译器接受,去掉额外的Ts可变参数包后,所有编译器均支持该写法。
解答
该写法不符合C++标准规范,clang的支持属于非标准扩展,GCC、MSVC拒绝编译的行为是符合标准要求的,核心原因如下:
- C++标准明确要求:函数形参列表中的普通形参包必须是形参列表的最后一个元素。你代码中
Ls...和Ts...都是可变长形参包,Ls...出现在Ts...之前,编译器无法从传入的实参中自动推导两个形参包各自对应的参数范围,也不支持显式指定这两个形参包的实参,因此属于非法写法。 - 当你删除
Ts...参数包后,Ls...成为形参列表的最后一个元素,符合标准对形参包位置的要求,因此所有编译器都可以正常编译。
内容的提问来源于stack exchange,提问作者Jarod42
相关产品推荐
相关产品推荐

