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

标签 c++ for-loop language-lawyer

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 ]

是为了允许循环中的结构化绑定(bind)。例如你可以这样做:

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 仅引用结构体的成员。

关于c++ - 如何在C++中正确使用for-range语句语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69226393/

相关文章:

java - java中arraylist的for循环中的"if"或"where"?

Java - 尝试在此 forLoop 的每次迭代上绘制图像

c++ - const T& rf = lvalue of T 是身份转换吗?

c - 是否保证相同类型的值之间没有填充?

c++ - cos(x) 是否需要在使用 IEEE-754 的不同 C++ 实现中返回相同的值?

c++ - GDB C++ 如何停止进入标准库

c++ - "hInstance"未定义。 C++ WIN32 APP

捕获列表中的 C++ lambda 复制值

C++:基函数的变化(即十六进制到八进制、十进制等)- 十六进制值的输出略有偏差

windows - 无法将 FOR 循环的输出分配给批处理文件中的另一个变量