Лямбда-пачка с многоточием с обеих сторон - в чем смысл? - программирование
Подтвердить что ты не робот

Лямбда-пачка с многоточием с обеих сторон - в чем смысл?

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++ (транк) компилирует его, но я честно пытаюсь понять его значение. Что это должно означать? Что будет сгенерировать замыкание в качестве членов данных?

4b9b3361

Ответ 1

Это должно быть плохо сформировано. Подано 89686 (... и уже исправлено!) Грамматика в [expr.prim.lambda.capture]:

захватить:
простой захват ... опт
... выбрать init-capture

Вы можете иметь простой-захват (который был бы xs...), или вы можете иметь Init-захват (который будет ...xs=xs, INIT захват должен иметь инициализатор). Вы не можете иметь оба сразу.