C では、配列サブスクリプション:a[b]
は、ポインター演算の後の逆参照に相当するシンタックス シュガーにすぎません (ここで*(a+b)
説明したように)。
基本型の配列サブスクリプションはC++でどのように解釈されますか? (オーバーロードのセマンティクスがあるクラスではありません)? より具体的には、C++ が下付き文字として期待する型は何ですか? それはptrdiff_t
ですか?
配列サブスクリプションは C++ でどのように解釈されますか?
C ++ E1[E2]
では、_*((E1)+(E2))
C++ は、添字としてどのような型を期待していますか?
C++は、スコープのない列挙型または整数型を想定しています。両方の項目は、ドラフト C++ 標準セクション5.2.1
Subscriptingパラグラフ1でカバーされています (強調鉱山):
後置式の後に角括弧で囲まれた式が後置式です。式の 1 つは「T へのポインター」型を持ち、もう 1 つはスコープのない列挙型または整数型を持つ必要があります。結果は「T」型の左辺値です。型「T」は、完全に定義されたオブジェクト型でなければなりません。62式 E1[E2] は(定義により) *((E1)+(E2)) と同じです[ 注: * と + の詳細については 5.3 と 5.7 を、配列の詳細については 8.3.4 を参照してください。—終わりのメモ]
James が指摘しているように、One of the expressions should haveという文言では、ポインターと添え字を入れ替えることができます。たとえば、次のようになります。
#include <iostream>
int main()
{
int arr[5] = {1, 2, 3, 4, 5 } ;
std::cout << arr[2] << ":" << 2[arr] << std::endl ;
}
代替構文を使用すること2[arr]
はお勧めしません。ほとんどの人はこれが何をしているのかわからないため、コードが読みにくくなり、保守しにくくなります。
これは、ドラフトC99標準 6.5.2.1
配列添字パラグラフ2の関連セクションに似ています(強調鉱山):
角括弧 [] 内の式が後に続く後置式は、配列オブジェクトの要素の添え字指定です。添字演算子 [] の定義は、 E1[E2] が (*((E1)+(E2))) と同一であるということです。2 項 + 演算子に適用される変換規則により、E1 が配列オブジェクト (配列オブジェクトの最初の要素へのポインターと同等)であり、E2 が整数の場合、E1[E2] は E2 番目の要素を指定します。 E1 (ゼロから数えます)。
この点では、C++ は C とまったく同じです。C++11 §5.2.1:
式
E1[E2]
は (定義上) と同じです。*((E1)+(E2))