指针和数组上操作符[]的索引参数类型

Index parameter type for operator[] on pointers and arrays

本文关键字:索引 参数 类型 数组 操作符 指针      更新时间:2023-10-16

指针操作符[]的自然形参类型是什么,如:

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

我知道我可以输入任何整数类型,但是数组索引的自然类型是什么?不引起隐式转换的那个?

指针上的operator []可以是任意整型表达式

一般来说,ptrdiff_t在技术上是你想要的,如果意图是datadata + i是任意两个指针中的任意一个,并且指向任意内存块,因为ptrdiff_t被定义为保存两个指针之间的差异的符号类型(然而,它不能保证不溢出:ptrdiff_t在32位指针的机器上通常是32位,而不是下一个更高的符号整数大小)

std::vector<T>中,通常使用size_t,因为std::vector有额外的限制,指针指向块的开始,并且只允许在分配的块内索引,根据定义,该块不能大于size_t,并且不允许有负索引。size_t可以小于ptrdiff_tuintptr_t(可以保存指针的无符号整型),例如在分段体系结构中,内存分配仅限于一个段,而指针则没有。

现在,如果意图是datadata + i是同一块内存的一部分,但不一定是data + i >= data,那么我不认为有一个完全合适的自然数据类型(即size_t的签名对应)…我可能是错的)在标准c++ (ssize_t是一个POSIX扩展),但你可以用ptrdiff_t,因为它保证至少和你想要的一样大。

不能保证sizeof(long)sizeof(int)sizeof(ptrdiff_t)sizeof(size_t)有任何关系…这样做会导致严重的bug。

EDIT:从技术上讲,没有可移植的方法来获得datai,这样datadata + i都是有效的指针,并且指向不同分配块中的不同对象,因为标准只保证指针算法在分配块中定义良好,所以如果您依赖于这样做,那么您的程序无论如何都是不可移植的。(不是说它不工作,在大多数情况下…)