12

考虑以下最小示例:

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

混合折叠表达式和空参数包时的预期行为到底是什么?

4

1 回答 1

15

这在[temp.variadic]¶9中有介绍(引用 N4618):

如果N对于一元折叠表达式为零,则表达式的值如表 14 所示;如果运算符未在表 14 中列出,则实例化格式不正确。

表 14 - 折叠空序列的值

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

P0036R0中概述了仅支持这三个运算符的原因。

于 2016-07-25T16:44:23.723 回答