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

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

1 Ответ

17 голосов
/ 12 марта 2019

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

capture:
простой захват ... opt
... opt init-capture

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

...