4

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

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

  value_t * data;
};

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

4

1 回答 1

5

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

一般来说,ptrdiff_t从技术上讲,这是您想要的,如果意图是data并且data + i是任意两个任意指针中的任意两个指针和任意内存块,因为ptrdiff_t它被定义为用于保存两个指针之间差异的有符号类型(但是,它是不保证不会溢出:ptrdiff_t在具有 32 位指针的机器上通常是 32 位,而不是下一个更高的有符号整数大小)

In std::vector<T>, size_t(通常)被使用,因为std::vector有一个额外的限制,即指针指向块的开头,并且索引只允许在分配的块内,它不能大于size_t定义,并且不允许负索引。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)......假设这样会导致令人讨厌的错误。

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

于 2013-02-28T21:59:48.697 回答