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

Dan*_*iel 4 c++

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

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

  value_t * data;
};
Run Code Online (Sandbox Code Playgroud)

我知道我可以提供任何整数类型,但是数组索引的自然类型是什么,即.哪一个不会导致隐式转换?

Ste*_*Lin 5

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

很一般,ptrdiff_t在技术上是你想要什么,如果意图是datadata + i是在任何其他和内存的任意块任意两个三分球,因为ptrdiff_t被定义为一个符号类型保持两块指针(然而,这之间的区别不保证不溢出:ptrdiff_t在具有32位指针的机器上通常是32位,而不是下一个签名的整数大小更高)

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

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

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

编辑:从技术上讲,有获得没有可移植的方法data,并i使得datadata + i都是有效的指针和指向不同的分配块不同的对象,因为该标准只保证指针算法是一个分配的块中的明确定义,所以如果你是依靠这样做,无论如何你的程序是不可移植的.(在大多数情况下,它不会起作用......)