如何制作可变参数的 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 的意思),那么无论代码是否正确,这都意味着编译器存在错误。
当我尝试制作可变 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 的意思),那么无论代码是否正确,这都意味着编译器存在错误。