【问题标题】:Fold expressions and empty parameters pack: what's the expected result?折叠表达式和空参数包:预期结果是什么?
【发布时间】:2016-07-25 16:36:59
【问题描述】:

考虑以下最小示例:

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

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

【问题讨论】:

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


    【解决方案1】:

    [temp.variadic]¶9(引用 N4618)对此进行了介绍:

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

    表 14 - 折叠空序列的值

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

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

    【讨论】:

    • @Borgleader:见P0036R0。然而P0160R0 表示空参数包的默认值已被完全删除;我不确定发生了什么变化,或者为什么这没有反映在当前的草案中。
    • @ildjarn 这没有在全体会议上达成共识,所以最终他们投票给了 P0036。
    • @T.C. : 谢谢!我现在在Kona minutes 论文中看到了这一点;以供将来参考,是否有更容易查看此类投票结果的来源,或者会议记录是最好的查看位置?
    • @ildjarn 会议记录仍然是查看 AFAIK 的最佳公开场所。
    • @ildjarn 实际上有四个用户名为 downvoter。您正在与他们中的哪一个交谈,您怎么知道是他们否决了答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多