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

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

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

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

10

Решение

Это покрыто [Temp.variadic] ¶9 (цитируя N4618):

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

Таблица 14 — Значение складывания пустых последовательностей:

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

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

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]