Для разворачивания выражения свёртки стандарт языка предусматривает унарные и бинарные конфигурации расположения аргументов пакета параметров; наличие скобок в них обязательно:
- Унарная правая свёртка:
(pack op ...)
- Унарная левая свёртка:
(... op pack)
- Бинарная правая свёртка:
(pack op ... op value)
- Бинарная левая свёртка:
(value op ... op pack)
Свёртка разворачивается в выражение:
- Унарная правая свёртка
(E op ...)
разворачивается в выражение(E₁ op (... op (Eₙ₋₁ op Eₙ)))
- Унарная левая свёртка
(... op E)
разворачивается в выражение(((E₁ op E₂) op ...) op Eₙ)
- Бинарная правая свёртка
(E op ... op I)
разворачивается в выражение(E₁ op (... op (Eₙ₋₁ op (Eₙ op I))))
- Бинарная левая свёртка
(I op ... op E)
разворачивается в выражение((((I op E₁) op E₂) op ...) op Eₙ)
(где n
это количество элементов в pack expansion)
Проблема определения типа и значения при раскрытии пустой унарной свёртки в общем случае считается ошибкой, за исключением трёх ситуаций:
- пустое раскрытие унарной свёртки
&&
даётtrue
, - пустое раскрытие унарной свёртки
||
даётfalse
, - пустое раскрытие унарной свёртки
,
даёт типvoid
.