1. ホーム
  2. c++

[解決済み] プレーン配列の範囲指定はどのように行われるのですか?

2023-04-05 23:42:35

質問

C++11 では、範囲ベースの for として機能します。 foreach のような役割を果たします。これはC言語のプレーンな配列でも動作します。

int numbers[] = { 1, 2, 3, 4, 5 };
for (int& n : numbers) {
    n *= 2;
}

停止するタイミングはどのように知るのでしょうか?と同じスコープで宣言された静的配列に対してのみ動作するのでしょうか? for が使われているのと同じスコープで宣言された静的配列にしか使えないのですか?この for を動的配列と一緒に使うのですか?

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

型が配列であれば、どのような式でも動作します。例えば

int (*arraypointer)[4] = new int[1][4]{{1, 2, 3, 4}};
for(int &n : *arraypointer)
  n *= 2;
delete [] arraypointer;

の右側に渡される式の型は、より詳細な説明のために : の右側に渡された式の型が配列型である場合、ループの反復は ptr から ptr + size ( ptr は配列の最初の要素を指している。 size は配列の要素数)。

これは、ユーザー定義型とは対照的で、ユーザー定義型は beginend は、クラスオブジェクトを渡した場合はメンバとして、 また、(そのように呼ばれるメンバがない場合は)メンバでない関数を渡した場合はメンバとして 扱われます。これらの関数は、beginとendイテレータ(それぞれ最後の要素の直後とシーケンスの開始点を指す)を生成します。

この質問 は、なぜそのような違いがあるのかを明らかにします。