折叠表达式和空参数包:预期结果是什么?
Fold expressions and empty parameters pack: what's the expected result?
考虑以下最小示例:
#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()
.
混合折叠表达式和空参数包时,预期的行为到底是什么?
[temp.variadic]¶9(引用 N4618):
If N
is zero for a unary fold-expression, the value of the expression
is shown in Table 14; if the operator is not listed in Table 14, the instantiation is ill-formed.
Table 14 — Value of folding empty sequences:
Operator | Value when parameter pack is empty
-----------------------------------------------
&& | true
|| | false
, | void()
中概述了仅支持这三个运算符的原因
考虑以下最小示例:
#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()
.
混合折叠表达式和空参数包时,预期的行为到底是什么?
[temp.variadic]¶9(引用 N4618):
中概述了仅支持这三个运算符的原因If
N
is zero for a unary fold-expression, the value of the expression is shown in Table 14; if the operator is not listed in Table 14, the instantiation is ill-formed.Table 14 — Value of folding empty sequences:
Operator | Value when parameter pack is empty ----------------------------------------------- && | true || | false , | void()