1. ホーム
  2. c++

[解決済み] forループの変数で、increment文以外をconstにするには?

2023-06-03 21:09:01

質問

標準的なforループを考えてみましょう。

for (int i = 0; i < 10; ++i) 
{
   // do something with i
}

変数 i のボディで変更されないようにしたい。 for ループの中で修正されることはありません。

しかし i として const としてしまうと、インクリメント文が無効になってしまいます。このような場合 i a const という変数をインクリメント文の外側に置くことができますか?

どのように解決するのですか?

c++20からは レンジ::ビュー::イオタ をこのようにします。

for (int const i : std::views::iota(0, 10))
{
   std::cout << i << " ";  // ok
   i = 42;                 // error
}

ここでは デモ .


c++11からは、IIILE(immediately invoked inline lambda expression)を利用した以下の手法も利用できます。

int x = 0;
for (int i = 0; i < 10; ++i) [&,i] {
    std::cout << i << " ";  // ok, i is readable
    i = 42;                 // error, i is captured by non-mutable copy
    x++;                    // ok, x is captured by mutable reference
}();     // IIILE

ここでは デモ .

なお [&,i] というのは i は非変異性のコピーで捕捉され、それ以外はすべて変異性の参照で捕捉されることを意味します。また (); は単にラムダが即座に呼び出されることを意味します。