如何在 C++ 中正确使用 for-range 语句语法?

How to properly use the for-range statements syntax in C++?

iteration-statement:
    while ( condition ) statement
    do statement while ( expression ) ;
    for ( init-statement conditionopt ; expressionopt ) statement
    for ( init-statementopt for-range-declaration : for-range-initializer ) statement
for-range-declaration:
    attribute-specifier-seqopt decl-specifier-seq declarator
    attribute-specifier-seqopt decl-specifier-seq ref-qualifieropt [ identifier-list ]
for-range-initializer:
    expr-or-braced-init-list

以上语法由C++ISO给出。我已经看到大量使用 for-range 语句的经典方法的示例:

#include <iostream>
using namespace std;
int main() {
    int a[5] = { 1,2,3,4,5 };
    for (int i : a) { cout << i << endl; }
}

但我没有找到如何将 for-range-declaration 用作 attribute-specifier-seqopt decl-specifier-seq ref-qualifieropt [ identifier-list ]。在这种情况下它是如何工作的?你能举个例子吗?

这部分语法

attribute-specifier-seqopt decl-specifier-seq ref-qualifieropt [ identifier-list ]

允许循环中的结构化绑定。例如你可以这样做:

struct S { int i,j; };
std::vector<S> v;
for (auto [a, b] : v)
  // ... a and b simply refer to i and j

请注意,identifier-list 表示名称 ab 仅引用结构的成员。