问题描述
以下来自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 循环是一个语句。 ...
解包适用于(一两个例外)表达式,而不适用于语句。
以下来自权威的 C++ 提案 [...]
提案只是一个提案。找到 ISO C++ 论文并不意味着该论文的内容已被 ISO C++ 标准接受。您在提案中找到的代码示例不保证有效,有时作者会故意使用伪代码来避免不必要的样板。
for...
是无效的 C++ 语法。您可以查看最新的标准草案 here 以了解该语言中的实际内容和内容。