【发布时间】:2022-01-01 23:04:43
【问题描述】:
我遇到了以下代码:
for (int i = 0; i < subspan.size(); i++) {
...
int size = size_table[&(subspan[i]) - fullspan.begin()];
...
}
subspan和fullspan都是std::span类型(实际上是absl::Span来自Google's Abseil library,但它们似乎与std::span几乎相同)并且是同一数据数组的视图( fullspan 跨越整个数组)。
这是有效且定义明确的代码吗?当- 运算符与 lhs 指针一起应用时,它似乎取决于迭代器被转换为相应的指针值。
【问题讨论】:
-
视情况而定——因此您需要阅读文档才能找到答案。有几种可能性,取决于
absl::Span是什么,.begin()成员返回什么类型,&(subspan[i])的结果是什么类型(例如,&是“地址”运算符,还是它导致调用一元operator&()并返回其他内容?) -
我宁愿安全地通过
&*fullspan.begin()确保两者都是相同类型的指针 - 或者立即对迭代器进行操作,任何不使用基于 for 循环的迭代器的理由 - 或甚至是基于范围的? -
@Aconcagua 我不知道,不是我的代码。只是想了解它是否定义明确
-
@Aconcagua
or operate on iterators right away迭代器来自不同的跨度,所以我不认为它更安全;这更有可能编译,但如果迭代器类型验证范围,则可能在运行时失败。&*fullspan.begin()可以假设跨度确实是同一个数组。