【发布时间】:2021-11-25 07:15:03
【问题描述】:
the accepted answer to "Iterator to last element of std::vector using end()--"@barry 声明:
请注意,如果 vector::iterator 只是 T*(这将是有效的),则上面的第一种形式是非良构的。后两者不管用,所以更可取。
参考他的代码:
std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());
这一观点在 cmets 中存在争议,但没有明确的解决方案。所以这就是我的问题:第一个和第二个之间的语义差异到底是什么?对于 vector 以外的结构的迭代器,答案是否会有所不同?
【问题讨论】:
-
Mark Ransom 的最后一条评论 “右值是临时值...” 似乎在这里回答了这个问题。您对该评论有任何疑问或困惑吗?
-
所以答案是确实,第一行会导致未定义的行为?当迭代器类型(任何容器的)是不重载
--运算符的类型时会发生这种情况?如果是这样,我会接受这个效果的答案。 -
据我了解,对于
std::vector,所有 3 种可能性都可以。我没有看到--container.end()的问题。end()返回一个迭代器,--递减它。作为一般规则,任何对原始指针有效的语法也应该对std::vector有效。 -
@Phil1970
std::vector可以为其迭代器类型使用原始指针,在这种情况下,--将不起作用。 -
@ByteEater 如果迭代器不可逆,则尝试使用
--将无法编译。
标签: c++ pointers iterator undefined-behavior pointer-arithmetic