Расширение пакета параметров как части лямбда-захвата в выражении fold - gcc vs clang

Рассмотрим следующий фрагмент кода:

template <int... Is>
void foo()
{
    ([i = Is]{}(), ...); 
}
  • clang++ (соединительная линия) успешно компилирует код с помощью -std=c++17

  • g++ (соединительная линия) не скомпилируется со следующей ошибкой:

    <source>: In function 'void foo()':
    
    <source>:4:11: error: parameter packs not expanded with '...':
        ([i = Is]{}(), ...);
            ^~
    
    <source>:4:11: note:         'Is'
    <source>:4:16: error: operand of fold expression has no unexpanded parameter packs
        ([i = Is]{}(), ...);
        ~~~~~~~~~~^~
    

    на godbolt.org

Является ли это g++ ошибкой, или стандарт предотвращает расширение пакета параметров в составе лямбда-интродуктора?

Ответ 1

У этого есть ошибка об этом.

[temp.variadic]/4

Расширение пакета состоит из шаблона и многоточия, при создании которых создается нуль или более экземпляров шаблона в списке (описано ниже). Форма шаблона зависит от контекста, в котором происходит расширение. Расширения пакетов могут возникать в следующих контекстах:

  • ... [не имеет значения]
  • В складчатом выражении; шаблон представляет собой выражение-cast, которое содержит пакет нерасширенных параметров.

Полное выражение лямбда (как и у вас) с вызовом функции является допустимым выражением, если следовать за грамматическими постановками. Нет причин препятствовать тому, чтобы он был действительным образцом.