在单个左值上迭代
Iterating over a single lvalue
我想把一个左值传递给一个需要一对迭代器的函数,让它像我把一对迭代器传递给只包含这个值的范围一样。
我的方法如下:
#include <iostream>
#include <vector>
template<typename Iter>
void iterate_over(Iter begin, Iter end){
for(auto i = begin; i != end; ++i){
std::cout << *i << std::endl;
}
}
int main(){
std::vector<int> a{1,2,3,4};
iterate_over(a.cbegin(), a.cend());
int b = 5;
iterate_over(&b, std::next(&b));
}
这在g++5.2中似乎是正确的,但我想知道这是否真的是定义的行为,是否存在任何潜在的问题?
是的,这是定义的行为。首先我们有来自[expr.add]/4
出于这些运算符的目的,指向非数组对象的指针的行为与指向长度为1的数组的第一个元素的指针相同,其中对象的类型为其元素类型。
因此,将单个对象视为长度为1的数组。然后我们有[expr.add]/5
[…]此外,如果表达式p指向数组对象的最后一个元素,则表达式(p)+1指向数组对象最后一个元件后的一个,并且如果表达式Q指向数组对象最近一个元件前的一个元件,则表达式"Q"-1指向数组对象最后一个元件如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象最后一个元素之后的元素,则求值不应产生溢出否则,行为未定义。
强调矿
因此,由于第一个数组元素也是最后一个数组元素,并且在最后一个元素上加1可以得到经过对象的一个,所以这是合法的。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 将多个 for 循环组合成单个迭代器
- C++:如何用单个命令替换复杂的迭代?
- 如何在单个模板调用中传递const_iterator和非const迭代器
- 在C++中,是否可以在单个循环中顺序迭代多个迭代器
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- char 数组在上次迭代时复制整个单词而不是单个字母
- 提升 ASIO 1.66 示例无法构建 - async_connect() 需要单个迭代器无法在 VS2010 上链接
- C++ unordered_map单个对象上的迭代器
- 容器的迭代器能否产生左值以外的其他内容?
- 通过单个向量进行迭代并删除作为其他元素子集的元素
- 使用迭代器C++在行和列矩阵中上/下/左/右导航
- 当比较来自单个向量的迭代器时,会引起什么'iterators are incompatible'?
- c++ 11:在迭代时从std::unordered_map中删除单个元素是否安全?
- 单个迭代使用MS concurrency::parallel_for()的性能
- 只产生单个值的迭代器
- 如何解决一系列关于迭代器构造函数的错误,包括期望的左值、缺失的转换和可行性
- vector的单个迭代器
- 在单个左值上迭代