指针和数组上的operator []的索引参数类型

时间:2013-02-28 21:18:53

标签: c++

指针上的operator []的自然参数类型是什么,如:

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

  value_t * data;
};

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

1 个答案:

答案 0 :(得分:5)

指针上的

operator []可以是任何整数表达式

一般来说,ptrdiff_t在技术上是你想要的,如果datadata + i的意图是任意两个任意指针和任意内存块,因为ptrdiff_t被定义为用于保持两个指针之间差异的有符号类型(但是,它不能保证不会溢出:{32}指针的机器上的ptrdiff_t通常是32位,而不是下一个签署整数尺寸更高)

std::vector<T>中,size_t是(通常)使用的,因为std::vector具有指针指向块开头的附加限制,并且仅在分配的块内允许索引,根据定义,不能大于size_t,也不允许有负面指标。 size_t可以小于ptrdiff_tuintptr_t(可以保存指针的无符号整数类型),例如在分段体系结构中,其中内存分配仅限于一个段但指针不是

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

无法保证sizeof(long)sizeof(int)sizeof(ptrdiff_t)sizeof(size_t)有任何关系......假设这样会导致令人讨厌的错误。

编辑:从技术上讲,没有可移植的方式来获取datai,因此datadata + i都是有效的指针和点对于不同分配块中的不同对象,因为标准只保证指针算法在分配的块中定义良好,所以如果你依赖这样做,那么你的程序无论如何都是不可移植的。 (并非在大多数情况下它都不起作用......)