2016-07-25 65 views
10

考虑下面的小例子:折叠表达式和空参数pack:期望的结果是什么?

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

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

回答

12

这是覆盖在[temp.variadic]¶9(援引N4618):

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

表14 - 折叠空序列的值:

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

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

+0

我很想知道为什么这些操作员被单挑出来,而不是使他们都形成不良。 – Borgleader

+4

@Borgleader:参见[P0036R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0036r0.pdf)。然而[P0160R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0160r0.html)表示,空参数包的默认值已解决为完全移除;我不确定发生了什么变化,或者为什么这不会反映在当前的草案中。 – ildjarn

+0

@ildjarn在全体会议上没有达成共识,所以最终他们投了P0036。 –

相关问题