如何制作一个可变的lambda?

时间:2015-03-24 11:34:31

标签: c++ gcc lambda clang variadic-functions

当我尝试制作一个可变的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;
}

1 个答案:

答案 0 :(得分:10)

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

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