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

回到顶部