如何制作可变lambda

How to make a variadic lambda?

本文关键字:lambda 何制作      更新时间:2023-10-16

当我尝试制作可变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:错误:在具有固定参数的函数中使用了"va_start"[](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;
}

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

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