Лямбда-пачка с многоточием с обеих сторон - в чем смысл?
P0780 ("Разрешить расширение пакета в lambda init-capture"), одобренный для С++ 20, позволяет генерировать пакет элементов данных замыкания, помещая многоточие (...
) перед расширением пакета как часть захвата лямбды.
Это полезно, например, при захвате пачки ходом:
template <typename... Ts>
void foo(Ts... xs)
{
bar([...xs = std::move(xs)]{ /* ... */ });
}
Играя с этой функцией, я придумал эту загадочную конструкцию:
template <typename... Ts>
void foo(Ts... xs)
{
[...xs...]{}();
}
int main()
{
foo(0, 1, 2);
}
живой пример на godbolt.org
g++ (транк) компилирует его, но я честно пытаюсь понять его значение. Что это должно означать? Что будет сгенерировать замыкание в качестве членов данных?
Ответы
Ответ 1
Это должно быть плохо сформировано. Подано 89686 (... и уже исправлено!) Грамматика в [expr.prim.lambda.capture]:
захватить:
простой захват ...
опт
...
выбрать init-capture
Вы можете иметь простой-захват (который был бы xs...
), или вы можете иметь Init-захват (который будет ...xs=xs
, INIT захват должен иметь инициализатор). Вы не можете иметь оба сразу.