std :: reverse_iterator奇怪的行为(UB?)
我创建了一个伪容器类(它不包含任何元素)和一个此容器的迭代器类。 下面的代码总是输出“776”我的系统上(我的编译器是gcc 5.4.0)std :: reverse_iterator奇怪的行为(UB?)
#include <iostream> #include <iterator>
class Container
{
public:
class Iterator;
Container()=default;
Container::Iterator begin();
Container::Iterator end();
};
class Container::Iterator: public std::iterator<std::bidirectional_iterator_tag, size_t>
{
public:
Iterator(size_t n);
size_t& operator*();
Container::Iterator& operator--();
const Container::Iterator operator--(int);
bool operator==(const Container::Iterator& rhs) const;
bool operator!=(const Container::Iterator& rhs) const;
private:
size_t n_;
};
Container::Iterator Container::end()
{
return Iterator(777);
}
Container::Iterator::Iterator(size_t n):
n_(n)
{
}
size_t& Container::Iterator::operator *()
{
return n_;
}
Container::Iterator& Container::Iterator::operator--()
{
n_--;
return *this;
}
const Container::Iterator Container::Iterator::operator--(int)
{
Container::Iterator oldVal = *this;
n_--;
return oldVal;
}
int main()
{
Container cont;
std::reverse_iterator<Container::Iterator>revit(cont.end());
//as cppreference says, "For a reverse iterator r constructed from an iterator i, the relationship &*r == &*(i-1) is always true...", so I expect that the output must be the same as if I used instead next commented line, and it does so on my system
// auto it = cont.end(); it--; std::cout << *it << std::endl;
std::cout << *revit << std::endl;
return 0;
}
但是当我使用任何在线编译器(用C++ 11的支持),该代码输出只是“0 '(除了一个Clang版本,那么输出是一些'随机'大数字)
我弄不明白,我的错误在哪里?
回答:
std::reverse_iterator::operator*
is equivalent to
Iterator tmp = current; return *--tmp;
(其中current
是通过reverse_iterator
此实例包裹底层迭代器)。
*tmp
返回对tmp
的成员的引用 - 它超出了范围,并在std::reverse_iterator::operator*
返回时带出该成员。因此,*revit
返回一个悬挂参考;随后的尝试使用它展示未定义的行为。
以上是 std :: reverse_iterator奇怪的行为(UB?) 的全部内容, 来源链接: utcz.com/qa/257113.html