4

所以,我偶然发现的是:

std::map<double, int> map1;
std::map<double, int> map2;

map1[2.5] = 11;
map1[3.5] = 12;

map2[2.5] = 21;
map2[3.5] = 22;

std::map<double, int>::iterator iterMap1 = map1.find(2.5);

//I will now try to erase a key/value pair in map2 with an iterator 
//that points to map1. This is bad/wrong. But I am surprised 
//this is allowed. 
map2.erase(iterMap1); 

//what do you think would be printed?
print(map1);
print(map2);

有人可以解释这种行为吗?我认为这不应该被允许。

我得到的输出是:

Map1
2.5 11

Map2
2.5 21
3.5 22

这对我来说没有意义。谢谢。

4

2 回答 2

5

你是什​​么意思它是允许的?它在标准中是不允许的,并且会导致未定义的行为,但这并不意味着编译器必须对你大喊大叫。

在一般情况下,编译器无法检查这一点。映射和迭代器可以传递给一个函数,并且无法知道迭代器是否引用容器,因此不能强制编译器对其进行诊断。

由程序员编写有效且正确的程序。编译器可以帮助但不能照看孩子。

于 2013-09-20T19:53:22.873 回答
3

有人可以解释这种行为吗?

也许吧,但这会浪费时间,因为它是未定义的行为,并且可能会因实现而异。

我认为这不应该被允许。

你是对的。这个不允许。但是这个限制是针对你,代码的作者,而不是编译器。一旦你打破了规则,编译器就可以自由地做任何最方便的事情。

于 2013-09-20T19:53:03.067 回答