我遇到了以下代码:
for (int i = 0; i < subspan.size(); i++) {
...
int size = size_table[&(subspan[i]) - fullspan.begin()];
...
}
subspan
和fullspan
都是std::span
类型(实际上是来自Google's Abseil library的absl::Span
) ,但它们似乎与 std::span
几乎相同),并且是同一数据数组的 View (fullspan
跨越整个数组)。
这是有效且定义良好的代码吗?当 -
运算符与 lhs 指针一起应用时,它似乎依赖于将迭代器转换为相应的指针值。
最佳答案
Is it valid to subtract an iterator from an element pointer to get a valid index?
可能是这样,具体取决于迭代器的定义方式。例如,如果迭代器是相同类型的指针,并且指向相同数组的元素,则它可以工作。
但是,没有通用迭代器概念指定此类操作,因此不能保证此类操作适用于任何标准迭代器。因此,它不能在通用代码中工作,这不是一个可移植的假设。
Is this valid and well defined code?
所讨论的迭代器类型被定义为指针类型,因此满足条件。 Abseil 既没有完整的文档记录也没有详细说明,因此很难说这是有意的功能还是偶然的实现细节。如果是后者,那么代码可能会在 Abseil 的 future 版本中崩溃。
关于c++:从元素指针中减去迭代器以获得有效索引是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70081152/