如何制作可变参数的 lambda?

How to make a variadic lambda?

当我尝试制作可变 lambda 时:

#include <cstdarg>

int main() {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return 0;
}

使用 GCC 可以正常编译,但 clang 拒绝它:

main.cpp:4:35: error: 'va_start' used in function with fixed args
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
                                  ^

这里哪个编译器是正确的?是否可以制作可变 lambda?


奇怪的是,以下结果导致 ICE 发出 clang 声,因此看起来 clang 因可变参数而出现错误:

int f(...) {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return;
}

可变 lambda 似乎是允许的 - 指定参数的语法与任何其他函数声明使用的 parameter-declaration-clause 相同,并且没有禁止的特定规则它以省略号结尾。 (C++11 确实禁止默认参数,但不禁止省略号,并且在 C++14 中删除了该限制。)

在任何情况下,如果存在内部编译器错误(我假设这就是您所说的 ICE 的意思),那么无论代码是否正确,这都意味着编译器存在错误。