当我尝试制作一个可变的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?
奇怪的是,下面的结果是一个带有clang的ICE,所以看起来clang是变容器的错误:
int f(...) {
[] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
return;
}
答案 0 :(得分:10)
似乎允许Variadic lambdas - 指定参数的语法与任何其他函数声明使用的 parameter-declaration-clause 相同,并且没有特定的规则禁止它以省略。 (C ++ 11确实禁止默认参数,但不禁用省略号,并且在C ++ 14中删除了该限制。)
在任何情况下,如果存在内部编译器错误(我假设你是ICE的意思),那么这意味着编译器有一个错误,无论代码的正确性如何。