这是正确的行为吗?std :: map迭代器失效

Kar*_*Rei 5 c++ iterator stdmap

#include <iostream>
#include <map>

int main(int argc, char** argv)
{
  std::map<int, int> map;
  map.emplace(1, 1);
  auto reverse_iter = map.rbegin();
  std::cout << reverse_iter->first << ", " << reverse_iter->second << std::endl;
  map.emplace(2, 2);
  std::cout << reverse_iter->first << ", " << reverse_iter->second << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印出:

1, 1
2, 2
Run Code Online (Sandbox Code Playgroud)

根据标准,这真的应该发生吗?我没有触及reverse_iter,但它指向的值正在改变.我认为std :: map中的迭代器应该是安全的,不会插入.然而,似乎在决定reverse_iter不是要指向我告诉它的价值,而是指"在这个时间点发生在地图末尾的任何事情".

更新:进一步的信息,万一重要:这似乎不会发生前进迭代器(在任何情况下,我似乎可以找到),我的gcc版本是5.1.1-4.

Sla*_*ica 3

正如此处引用的http://en.cppreference.com/w/cpp/container/map/rbegin

反向迭代器将迭代器存储到下一个元素,而不是它实际引用的元素

副作用是,如果您在该迭代器之前插入某些内容(包括 end()),那么当您取消引用该反向迭代器时,您将看到该新值。我不认为反向迭代器在这种情况下无效。