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

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


person Vittorio Romeo    schedule 12.03.2019    source источник


Ответы (1)


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

захват:
простой захват ...opt
...opt init-capture< /эм>

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

person Barry    schedule 12.03.2019