繁体   English   中英

可变参数模板适用于 gcc 但不适用于 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 接受涉及 function 包扩展声明的无效程序

笔记

值得注意的是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM