プログラミング
C++20でforループの構文が改善されました
C++20 Improved the For-Loop Syntax (lzon.ca)
要約
この記事では、C++20で導入された「初期化子付き範囲ベースfor文」という構文糖について解説しています。これにより、PythonやLuaのような他の言語と同様に、ループ内でインデックスと要素参照を同時に宣言できるようになり、コードの可読性と簡潔性が向上します。この小さな機能改善が、コードベース全体で大きなメリットをもたらすと筆者は述べています。
全文翻訳
C++20でforループの構文が改善されました
ブログCodex
C++20でforループの構文が改善されました
投稿日: 2026年7月11日 · 2分で読めます
C++20からの小さな構文糖です。
例えば、以下のようなものを出力したいとします。
1: the
2: quick
3: brown
4: fox
5: jumped
6: over
7: the
8: lazy
9: dog
Pythonを使用する場合、次のように記述します。
1vec = [
2 "the", "quick", "brown", "fox",
3 "jumped", "over", "the", "lazy", "dog"
4]
5
6 7 8for i, it in enumerate(vec, start=1):
9 print(f"{i}: {it}")
Luaを使用する場合、次のようになります。
1local vec = {
2 "the", "quick", "brown", "fox",
3 "jumped", "over", "the", "lazy", "dog"
4}
5
6 7 8for i, it in ipairs(vec) do
9 print(i .. ": " .. it)
10 end
しかし、C++17以前を使用する場合、同等のアプローチは次のようになります。
1vector<string> vec = {
2 "the", "quick", "brown", "fox",
3 "jumped", "over", "the", "lazy", "dog"
4};
5
6 7 8for (int i = 0; i < vec.size(); ++i) {
9 auto&& it = vec[i];
10 cout << i << ": " << it << endl;
11 }
これらの例の共通点は、インデックス値と要素参照の両方をスコープに含めるforループを生成することです。C++は、追加のステートメントでループスコープに参照を導入する必要がある点で際立っています。
C++20では、他の言語に一致する例を作成することが可能になり、次のようになります。
1vector<string> vec = {
2 "the", "quick", "brown", "fox",
3 "jumped", "over", "the", "lazy", "dog"
4};
5
6 7 8for (int i=0; auto&& it: vec)
9 cout << (++i) << ": " << it << endl;
これを可能にする特定の提案は、Range-based for statements with initializer(初期化子付き範囲ベースfor文)と呼ばれ、C++17の以前の提案であるIf statement with initializer(初期化子付きif文)と非常によく似ています。この投稿で実証したことは、まさにこの言語機能の意図されたユースケースです。
私はこれが本当に好きです。非常に些細なことのように思えるかもしれませんが、このような小さな構文糖は、コードベース全体で使用すると大きな利益をもたらします。私は自分で発見したばかりですが、今後は従来のやり方よりもこれを排他的に使用するつもりです。
C++標準委員会は、言語のメンテナンスと、意味のある場合に有用な機能の導入において、まともな仕事をしているように思えます。あなたもこのような小さな品質向上のための機能を発見しましたか?もしそうなら、教えてください!mail@lzon.caにメッセージを送るか、ホームページのソーシャルアカウントのいずれかでDMを送ってください。