C++ 在C+中安全吗+;是否要从container.end()中减去?
也就是说,如果C++ 在C+中安全吗+;是否要从container.end()中减去?,c++,stl,iterator,language-lawyer,C++,Stl,Iterator,Language Lawyer,也就是说,如果容器不是空的,我可以安全地执行以下操作: std::vector<int> container; container.push_back( 0xFACE8D ); auto last = container.end() - 1; 对于任意的非空容器又如何 编辑:让我澄清这个问题 有时,完全合法的代码行为不正确。问题是:假设上述代码已编译,那么这样做安全吗 对于普通的C样式数组应该是安全的,因为相应的迭代器只是指针。但是对于更复杂的容器来说安全吗 假设有人使用如下迭代器
容器
不是空的,我可以安全地执行以下操作:
std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;
对于任意的非空容器又如何
编辑:让我澄清这个问题
有时,完全合法的代码行为不正确。问题是:假设上述代码已编译,那么这样做安全吗
对于普通的C样式数组应该是安全的,因为相应的迭代器只是指针。但是对于更复杂的容器来说安全吗
假设有人使用如下迭代器实现列表:
class MyListIterator {
MyListIterator *prev, *next;
MyListIterator * operator--() { return prev; }
...
};
class MyList {
MyListIterator *end() { return NULL; }
...
};
然后,尽管在语法上完全合法,但尝试递减container::end()
,将导致segfault
不过,我希望
stl
容器比这聪明得多。因此,关于上述stl::list
代码行为(如果有)的保证问题将返回。std::vector
,因此是的,这对于vector
是安全的
std::list
返回。它们可以递增(++
)和递减(--
),但不允许进行任意算术(++
,-
)或相对比较(<代码> >代码> <代码> < P> C++标准称与
std::vector
不同,std::list::iterator
是一种双向迭代器,只支持--
和++
运算符。如果它能编译,就意味着有人在实现运算符时遇到了麻烦()
,这强烈表明他们打算让你称之为…@crayzeewulf:我不是在提倡这种用法,只是好奇它是否安全,在代码中看到了类似的东西。@Kevin“它会编译,所以一定没问题”在C++中是一个很差的试探法。@米迦勒得到了。在第二种情况下,我看到了class MyListIterator {
MyListIterator *prev, *next;
MyListIterator * operator--() { return prev; }
...
};
class MyList {
MyListIterator *end() { return NULL; }
...
};