【一人 C++20 Advent Calendar 2019】初期化式をともなう範囲 for 文【2日目】

一人 C++20 Advent Calendar 2019 2日目の記事になります。

初期化式をともなう範囲 for 文

範囲 for 文を記述する際に次のように初期化式を含めることが出来るようになりました。

C++20 以前

{
  // for 文の外で初期化する必要があった
  T thing = f();
  for (auto& x : thing.items()) {
    // Note: “for (auto& x : f().items())” is WRONG
    mutate(&x);
    log(x);
  }
}

C++20 以降

// for 文の中で初期化できるようになった
for (T thing = f(); auto& x : thing.items()) {
  mutate(&x);
  log(x);
}

これを利用することで次のようにインデックス付きで for 文を回せることが出来ます。

#include <iostream>
#include <vector>

int
main(){
    auto xs = std::vector{"homu", "mami", "mado"};
    for(int i = 0; auto x : xs) {
        std::cout << i << " : " << x << std::endl;
        i++;
    }
    return 0;
}
/*
output:
0 : homu
1 : mami
2 : mado
*/

for 文の中でのみ使用する変数などを定義する時に便利そう。

サポートコンパイラ

  • GCC 9
  • Clang 8.0

参照