考虑以下最小例子:
#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<>(), "!");
}
注释行无法编译
使用*
代替+
也是如此
涉及布尔运算的那个可以改为工作。
Here(工作草案)我没有找到关于空参数包的提及
另一方面,here(isocpp)似乎上面案例中的默认结果是int()
。
混合折叠表达式和空参数包时,预期的行为是什么?
答案 0 :(得分:13)
[temp.variadic]¶9(引用N4618):
如果一元fold-expression的
N
为零,则为表达式的值 如表14所示;如果表14中未列出运算符,则实例化不正确。表14 - 折叠空序列的值:
Operator | Value when parameter pack is empty ----------------------------------------------- && | true || | false , | void()
P0036R0概述了仅支持这三个运营商的原因。