4

次のように、ポインターの演算子 [] の自然なパラメーターの型は何ですか。

struct foo
{
  value_t operator[](<TYPE?> i)
    { return data[i]; }

  value_t * data;
};

任意の整数型をフィードできることはわかっていますが、配列のインデックス付けの自然な型は何ですか。暗黙の変換を引き起こさないもの?

4

1 に答える 1

5

operator []on ポインタは任意の整数式にすることができます

一般的には、2 つのポインターの違いを保持するための符号付き型として定義されているため、2 つのポインターの違いを保持するための符号付き型として定義されているため、ptrdiff_t意図が、他のいずれかの任意の 2 つの任意のポインターであり、メモリの任意のブロックである場合は、技術的には必要です。オーバーフローしないことは保証されていません: 32 ビット ポインターを備えたマシンでは通常 32 ビットであり、次に大きい符号付き整数サイズではありません)datadata + iptrdiff_tptrdiff_t

ではstd::vector<T>size_t(通常) が使用されます。これstd::vectorは、ポインターがブロックの先頭を指し、割り当てられたブロック内でのみインデックス付けが許可され、size_t定義よりも大きくすることができず、負のインデックスが許可されないという追加の制限があるためです。or (ポインターを保持できる符号なし整数型)size_tよりも小さくすることができます。たとえば、メモリ割り当てが 1 つのセグメントに制限されているがポインターは制限されていないセグメント化されたアーキテクチャでは。ptrdiff_tuintptr_t

ここで、意図がdatadata + iが同じメモリ ブロックの一部であるが、必ずしもそのようなものdata + i >= dataではない場合、正確に適合する自然なデータ型 (つまり、符号付きの対応するものsize_t... は間違っている可能性があります)はないと思います。標準 C++ (ssize_tは POSIX 拡張機能) ですがptrdiff_t、少なくとも必要な大きさであることが保証されているため、使用できます。

orがsizeof(long)orsizeof(int)と何らかの関係を持っているという保証はありません。sizeof(ptrdiff_t)sizeof(size_t)

EDITdata : 技術的には、 and isuchを取得する移植性のある方法はありません。data両方data + iとも有効なポインターであり、異なる割り当てブロック内の異なるオブジェクトを指します。標準では、ポインター演算が割り当てられたブロック内で明確に定義されていることのみを保証するため、そうすることに依存している場合、プログラムはとにかく移植性がありません。(ほとんどの場合、うまくいかないというわけではありません...)

于 2013-02-28T21:59:48.697 に答える