Как сделать вариационную лямбду?
Когда я пытаюсь сделать вариационную лямбду:
#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), то это означает, что у компилятора есть ошибка, независимо от правильности кода.