Как сделать вариационную лямбду?

Когда я пытаюсь сделать вариационную лямбду:

#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); };
                                  ^

Какой компилятор здесь правильно? Можно ли сделать вариационную лямбду?


Любопытно, что следующие результаты в ICE с clang, поэтому похоже, что clang не работает с вариациями:

int f(...) {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return;
}

Ответы

Ответ 1

Кажется, что допустимо использование varadic lambdas - синтаксис для указания параметров - это одно и то же предложение-декларация параметра, используемое любым другим объявлением функции, и нет конкретного правила, запрещающего его завершать с помощью многоточия. (С++ 11 запрещает аргументы по умолчанию, но не эллипсы, и это ограничение было удалено в С++ 14.)

В любом случае, если есть внутренняя ошибка компилятора (я предполагаю, что вы подразумеваете под ICE), то это означает, что у компилятора есть ошибка, независимо от правильности кода.