function_traits 使用可变模板和 va_args

function_traits with varidic tempate and va_args

前段时间遇到过这样的用法:

template <typename Return, typename ... Args>
struct function_traits<Return(*)(Args......)>{};

其中上面是 Args 的可变参数扩展,后面是 C 风格的可变参数。

最近在另一个媒体上讨论这个,对方认为这样做仍然有效:

template <typename Return, typename ... Args>
struct function_traits<Return(*)(Args...,...)>{};

他们认为逗号是允许的。但是以前我被迫使用......,但我不记得为什么。它绝对是在 Whosebug 上,但它是在一个不相关的主题上,我再也找不到它了。我确实记得一些关于 MSVC 错误的事情,它可能迫使我省略了逗号。

问题:

  1. 这两种形式的 varidic 扩展在该上下文中都有效吗?如果不是,为什么?;或
  2. 有人知道我记得读过的讨论在哪里吗?;在这种情况下关闭主题然后在此处链接将帮助其他人找到答案。我再也找不到它了,所以我想其他人也会有同样的问题。

Are both forms of the varidic expansion valid in that context, if not why?

两种形式都有效。语法产生的相关部分在[dcl.fct]/3

parameter-declaration-clause:
    parameter-declaration-listopt ...opt
    parameter-declaration-list , ... 

无论哪种方式,parameter-declaration-list 都可以跟随形成模板参数包扩展的产生式(这就是第二组 ... 的来源)。