如何制作一个可变的lambda?

rig*_*old 15 c++ lambda gcc clang variadic-functions

当我尝试制作一个可变的lambda:

#include <cstdarg>

int main() {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有了海湾合作委员会这个编译很好,但是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?


奇怪的是,以下结果导致了一个带有clang的ICE,所以看起来clang正在使用变量:

int f(...) {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 10

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

在任何情况下,如果存在内部编译器错误(我假设你是ICE的意思),那么这意味着编译器有一个错误,无论代码的正确性如何.