【问题标题】:Why does the fold expression not apply to for loop?为什么折叠表达式不适用于 for 循环?
【发布时间】:2021-08-05 03:11:46
【问题描述】:

以下来自an authoritative C++ proposal

template<class... TYPES>
constexpr void tuple<TYPES...>::swap(tuple& other)
{
    for...(constexpr size_t N : view::iota(0uz, sizeof...(TYPES)))
    {
        swap(get<N>(*this), get<N>(other));
    }
}

但是,我无法以相同的方式编译以下代码:

#include <iostream>
#include <vector>

template<typename... Args>
void f(Args&&... args)
{
    for...(auto n : args) // error: expected '(' before '...' token
    {
        std::cout << n << std::endl;
    }
}

int main()
{
    auto v = std::vector{1, 2, 3};
    f(v, v, v);
}

见:https://godbolt.org/z/dEKsoqq8s

为什么折叠表达式不适用于 for 循环?

【问题讨论】:

    标签: c++ syntax compiler-errors c++17 fold-expression


    【解决方案1】:

    因为折叠表达式是……表达式。 for 循环是一个语句... 解包(除了一两个例外)适用于表达式,而不适用于语句。

    【讨论】:

    • 提案中的sn-p代码是bug吗?见:open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0330r8.html
    • @xmllmx:这是来自提案的代码。该提案假设的提案将被采用并采用该语法。
    • @xmllmx 你认为“提案”这个词是什么意思?
    • 引用的提案被 C++23 接受。 @Yakk-AdamNevraumont
    • @xmllmx: ... 和?被接受的是一个小的库更改,添加了几个文字后缀。对for... 提案的引用是库更改有用的一个示例。真正的提案部分是措辞部分;其他一切都解释了为什么应该采用它。
    【解决方案2】:

    以下来自权威的 C++ 提案 [...]

    提案只是一个提案。找到 ISO C++ 论文并不意味着该论文的内容已被 ISO C++ 标准接受。您在提案中找到的代码示例不能保证是有效的,有时作者会故意使用伪代码来避免不必要的样板。

    for... 是无效的 C++ 语法。您可以查看最新的标准草案 here 以了解该语言中实际包含哪些内容,哪些不是。

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 2020-10-05
      • 2014-01-03
      • 2013-04-09
      相关资源
      最近更新 更多