[英]Variadic template as template parameter: deduction works with GCC but not with Clang
[英]Variadic template works in gcc but not in clang
我正在使用此处列出的书籍学习 C++。 特别是我阅读了可变参数模板。 现在,为了进一步理清我的概念,我还编写了简单的示例,并尝试使用调试器和 cout 语句自行理解它们。
下面给出了一个用 gcc 编译但被 clang 拒绝的程序。 演示。
template<typename T, typename... V>
struct C
{
T v(V()...);;
};
int main()
{
C<int> c; //works with gcc but rejected in clang
C<int, double, int, int> c2; //same here: works with gcc but rejected in clang
}
所以我的问题是哪个编译器就在这里(如果有的话)?
这是 clang 给出的错误:
<source>:6:12: error: '...' must be innermost component of anonymous pack declaration
T v(V()...);;
^~~
...
1 error generated.
Compiler returned: 1
这是一个GCC 错误。 正确的语法是T v(V...());
, Clang 接受而 GCC 拒绝(错误地)。
在 function 参数列表中,扩展包的...
必须位于参数名称之前,或者位于名称原本所在的位置。 这在V &&... v
这样的情况下更常见。
相关的语法是:函数定义->声明符->参数和限定符-> ... ->参数声明->抽象声明符(“抽象”= 无参数名称)。
[dcl.fct]/26
表示如果 function 参数列表中存在歧义...
是包扩展还是 C 样式可变参数,它会解析为包扩展。 但在这种情况下,没有歧义, V()...
使包未扩展(这应该是编译错误)并且...
应该是 C 风格的可变参数。
GCC 接受程序是错误的,因为在 function 参数名称之前(或代替)使用省略号 ( ...
) 引入了 function 参数包。
这意味着在您的示例中,使用指向 function 的指针类型的参数声明 function 的正确方法是T v(V...());
. 但请注意,gcc 拒绝此修改后的代码。 演示
这是 gcc 错误报告:
值得注意的是 gcc 拒绝T v(V...())
但接受T v(V...b())
。 演示
template<typename T, typename... V>
struct C
{
//-------vvv---------->this is the correct way which gcc rejects
T v(V...());
//-------vvv---------->but gcc accepts this when we name the parameter
T v(V...b());
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.