【问题标题】:Index parameter type for operator[] on pointers and arrays指针和数组上 operator[] 的索引参数类型
【发布时间】:2013-03-01 06:49:10
【问题描述】:

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

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

  value_t * data;
};

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

【问题讨论】:

  • size_t 是自然而然的选择
  • 这真的是编译器使用的吗? size_t 是无符号的,但我当然可以在 C++ 索引中使用负索引。
  • 编译器使用什么,在哪里?定义你所说的自然。如果您的容器不支持负索引,那么很自然地只接受无符号索引。
  • “自然”是指“编译器不执行隐式转换”。如果有一个标准化的数据类型,它是什么?如果它不是标准化的(比如一些编译器接受负索引,另一些不接受,或者编译器在内部使用不同的数据类型),那么我也很感谢关于这方面的权威信息。
  • mmm... 我认为标准没有指定特定的整数数据类型。但如果我不得不冒险猜测,我会说它是一个持有sizeof(integral_type) == sizeof (pointer) 的类型。所以long,可能。

标签: c++


【解决方案1】:

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

一般来说,ptrdiff_t 在技术上是您想要的,如果意图是让 datadata + i 成为其他任意两个任意指针以及指向任意内存块,因为定义了 ptrdiff_t作为用于保存两个指针之间差异的有符号类型(但是,不能保证不会溢出:ptrdiff_t 在具有 32 位指针的机器上通常是 32 位,而不是下一个更大的有符号整数大小)

std::vector&lt;T&gt; 中,(通常)使用size_t,因为std::vector 有一个额外的限制,即指针指向块的开头,并且只允许在分配的块内进行索引,不能大于size_t 根据定义,不允许有负面指标。 size_t 可以小于 ptrdiff_tuintptr_t(可以保存指针的无符号整数类型),例如在内存分配仅限于一个段但指针不是的分段架构中。

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

不能保证sizeof(long)sizeof(int)sizeof(ptrdiff_t)sizeof(size_t) 有任何关系...假设这样会导致严重的错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2021-01-11
    相关资源
    最近更新 更多