Сложить выражения и пакет пустых параметров: какой ожидаемый результат?
Рассмотрим следующий минимальный пример:
#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.