Сложить выражения и пакет пустых параметров: какой ожидаемый результат?

Рассмотрим следующий минимальный пример:

#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().

Какое именно ожидаемое поведение при смешивании флеш-выражений и пустых пакетов параметров?

Ответ 1

Это описано в [temp.variadic] ¶9 (со ссылкой на N4618):

Если N равно нулю для унарного складчатого выражения, значение выражения показан в таблице 14; если оператор не указан в таблице 14, экземпляр неформатирован.

Таблица 14 - Значение сбрасываемых пустых последовательностей:

   
Operator  |  Value when parameter pack is empty  
-----------------------------------------------
&&        |  true
||        |  false
,         |  void()

Причина, по которой поддерживаются только эти три оператора, описана в P0036R0.