Рассмотрим следующий минимальный пример:
#include<cstddef>
template<std::size_t... I>
constexpr auto sum() { return (I + ...); }
template<bool... B>
constexpr auto check() { return (B && ...); }
int main() {
static_assert(6 == sum<1,2,3>(), "!");
// static_assert(0 == sum<>(), "!");
static_assert(check<true, true>(), "!");
static_assert(check<>(), "!");
}
Закомментированная строка не компилируется.
То же самое касается использования *
вместо +
,
Вместо этого работает та, что включает логические значения.
Вот (рабочий проект) Я не нашел упоминаний о пустых пакетах параметров.
На другой стороне, Вот (isocpp) кажется, что результатом по умолчанию в приведенном выше случае является int()
,
Каково ожидаемое поведение при смешивании выражений складки и пустого пакета параметров?
Это покрыто [Temp.variadic] ¶9 (цитируя N4618):
Если
N
ноль для унарного выражения сгиба, значение выражения
показано в таблице 14; если оператор не указан в Таблице 14, экземпляр является плохо сформированным.Таблица 14 — Значение складывания пустых последовательностей:
Operator | Value when parameter pack is empty ----------------------------------------------- && | true || | false , | void()
Причина, по которой поддерживаются только эти три оператора, изложена в P0036R0.
Других решений пока нет …