【问题标题】:Why is this C++ fold expression valid?为什么这个 C++ 折叠表达式有效?
【发布时间】:2019-09-03 18:47:57
【问题描述】:

cppreference,我看到折叠表达式有四种类型,一元右,一元左,二元右,二元左。这个折叠表达式的类型是什么?我很难理解为什么它是有效的。

    template <typename Res, typename... Ts>
    vector<Res> to_vector(Ts&&... ts) {
        vector<Res> vec;
        (vec.push_back(ts) ...); // *
        return vec;
    }

*行中的“pack”、“op”和“init”的值是多少,如果有的话?

这个例子来自 Bjarne Stroustrup 的 A Tour of C++ 书的第 244 页,似乎在例子中忘记了一个逗号,因此我很困惑。

【问题讨论】:

  • 你最终得到一堆用逗号分隔的vec.push_back(...)s?
  • 是的,我明白了。我想知道这条线如何适合有效折叠表达式的定义。
  • 你可以检查this errata,然后你会发现这本书还有很多其他错误,为什么不报告这个错字-,丢失了?
  • @rafix07 我不会将大约 200 页中的 10 个错误称为“很多”

标签: c++ syntax fold-expression


【解决方案1】:

语法无效。它缺少一个逗号(很可能是错字):

(vec.push_back(ts), ...)
//                ^

所以它是“一元右折叠”:

( pack op ... )

op 是一个逗号。

【讨论】:

  • 请注意,在调用函数时展开包时,(pack...) 是正确的,折叠 (pack,...) 时是正确的。我自己也经常被这个烫伤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多