1

私がこのようなものを書くとき:

int data[] = {10,44,56,78,8};      
int i = 0;
for(int element : data)
   ...

その後for、コンパイラによって通常のfor?に変換されます。それはfor 単なる構文糖ですか?

4

1 に答える 1

7

標準では、範囲ベースのforステートメントが次のように定義されています。

{
  auto && __range = range-init;
  for ( auto __begin = begin-expr,
             __end = end-expr;
        __begin != __end;
        ++__begin ) {
    for-range-declaration = *__begin;
    statement
  }
}

あなたの場合、range-initis (data)begin-expris __rangeend-expris __range + 5for-range-declarationis int elementstatementis です...。つまり、これらすべてを置き換えると、forループは次のようになります。

{
  auto && __range = (data);
  for ( auto __begin = __range,
             __end = __range + 5;
        __begin != __end;
        ++__begin ) {
    int element = *__begin;
    ...
  }
}

この変換が実際にコンパイラによって行われるかどうかは、実装の詳細です。保証できる唯一のことは、コードが上記のコードと同等であることです。

于 2013-01-17T13:09:16.883 に答える