次のように、ポインターの演算子 [] の自然なパラメーターの型は何ですか。
struct foo
{
value_t operator[](<TYPE?> i)
{ return data[i]; }
value_t * data;
};
任意の整数型をフィードできることはわかっていますが、配列のインデックス付けの自然な型は何ですか。暗黙の変換を引き起こさないもの?
次のように、ポインターの演算子 [] の自然なパラメーターの型は何ですか。
struct foo
{
value_t operator[](<TYPE?> i)
{ return data[i]; }
value_t * data;
};
任意の整数型をフィードできることはわかっていますが、配列のインデックス付けの自然な型は何ですか。暗黙の変換を引き起こさないもの?
operator []
on ポインタは任意の整数式にすることができます
一般的には、2 つのポインターの違いを保持するための符号付き型として定義されているため、2 つのポインターの違いを保持するための符号付き型として定義されているため、ptrdiff_t
意図が、他のいずれかの任意の 2 つの任意のポインターであり、メモリの任意のブロックである場合は、技術的には必要です。オーバーフローしないことは保証されていません: 32 ビット ポインターを備えたマシンでは通常 32 ビットであり、次に大きい符号付き整数サイズではありません)data
data + i
ptrdiff_t
ptrdiff_t
ではstd::vector<T>
、size_t
(通常) が使用されます。これstd::vector
は、ポインターがブロックの先頭を指し、割り当てられたブロック内でのみインデックス付けが許可され、size_t
定義よりも大きくすることができず、負のインデックスが許可されないという追加の制限があるためです。or (ポインターを保持できる符号なし整数型)size_t
よりも小さくすることができます。たとえば、メモリ割り当てが 1 つのセグメントに制限されているがポインターは制限されていないセグメント化されたアーキテクチャでは。ptrdiff_t
uintptr_t
ここで、意図がdata
とdata + 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 i
suchを取得する移植性のある方法はありません。data
両方data + i
とも有効なポインターであり、異なる割り当てブロック内の異なるオブジェクトを指します。標準では、ポインター演算が割り当てられたブロック内で明確に定義されていることのみを保証するため、そうすることに依存している場合、プログラムはとにかく移植性がありません。(ほとんどの場合、うまくいかないというわけではありません...)