[英]MSVC vs Clang/GCC bug during overload resolution of function templates one of which contains a parameter pack
[英]GCC & Clang vs MSVC Bug while expanding template parameter pack in the same parameter clause for function templates
我在标准中遇到了以下声明:
如果模板参数是在其可选标识符之前带有省略号的类型参数,或者是声明包([dcl.fct])的参数声明,则模板参数是模板参数包。 作为参数声明的模板参数包,其类型包含一个或多个未扩展包,是包扩展。 ...作为包扩展的模板参数包不应扩展在同一template-parameter-list 中声明的模板参数包。
(结束报价)
因此,请考虑以下无效示例:
template<typename... Ts, Ts... vals> struct mytuple {}; //invalid
上面的例子是无效的,因为模板类型参数包Ts
不能在自己的参数列表中展开。
然后我对函数模板进行了同样的尝试,并期望得到相同的结果,但令我惊讶的是,它在 gcc 和 clang 中编译得很好,但在 msvc 中却没有。 示例如下:
//is this valid?
template<typename... T, T... ar>
void func(){}
int main()
{
}
同样,下面给出的示例在 gcc 和 clang 中编译,但不在 msvc 中:
//is this valid?
template<typename...T, int (*FUNC)(T...)>
int wrapper(T... args) { return (*FUNC)(args...) * 10; }
int main()
{
}
哪个编译器在这里? 也就是说,引用的语句 temp.param#17 是否适用于给定的两个示例,因此它们无效,或者引用不适用于给定的两个示例。
这是 GCC 和 Clang 中的一个错误。 您编写了明确定义为无效的代码,MSVC 正确地引发了错误,而 gcc 和 clang 则没有。 因此 MSVC 是正确的。 GCC 和 Clang 不是。
顺便说一句,我在 MSVC C++20 模式下运行了代码片段,但仍然抛出了同样的错误。 自 MSVC 中的 C++14 和 GCC 和 Clang 中的错误以来,它一直得到正确处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.