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

Why does the fold expression not apply to for loop?

以下来自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 循环?

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

Below is from an authoritative C++ proposal [...]

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

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