折叠表达式和空参数包:预期结果是什么?

时间:2016-07-25 16:36:59

标签: c++ templates c++17 fold-expression

考虑以下最小例子:

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

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

1 个答案:

答案 0 :(得分:13)

[temp.variadic]¶9(引用N4618):

  

如果一元fold-expression的N为零,则为表达式的值   如表14所示;如果表14中未列出运算符,则实例化不正确。

     

表14 - 折叠空序列的值

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

P0036R0概述了仅支持这三个运营商的原因。