Расширение пакета параметров как части лямбда-захвата в выражении 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, которое содержит пакет нерасширенных параметров.
Полное выражение лямбда (как и у вас) с вызовом функции является допустимым выражением, если следовать за грамматическими постановками. Нет причин препятствовать тому, чтобы он был действительным образцом.