考虑以下代码:
class MyClass
{
public:
int someInt;
MyClass() : someInt(666) { }
};
int main()
{
std::map<int,MyClass> myMap;
std::map<int,MyClass>::iterator it = myMap.end();
const MyClass& ref = it->second;
std::cout << ref.someInt << std::endl;
}
由于地图为空且it = myMap.end()
,it->second
引用的对象是什么?这是一个无效的引用,因为it = myMap.end()
?
map<int,MyClass>
不会创建MyClass
的实例。
答案 0 :(得分:3)
it->second
引用的对象是什么?这是一个无效的引用,因为it = myMap.end()
?
事实上。 myMap.end()
是一个有效的迭代器,但不能取消引用它。 it->second
尝试做到这一点并导致未定义的行为。
map<int,MyClass>
不会创建MyClass的实例。
是的,但无关紧要。 myMap.end()
将始终 - 无论myMap
的内容 - 包含对“一个过去结束”迭代器的引用,该迭代器绝不能被解除引用。
答案 1 :(得分:1)
std::map::end()将迭代器返回到地图中最后一个元素之后的第一个元素。如果你试图取消引用它,你将调用一个未定义的行为(google为“C鼻恶魔”)
答案 2 :(得分:0)
.end()
指向所包含序列的结尾之后的一个。迭代器仅对比较有效。
在引擎盖下它是一个指针,你显然可以比较,但它可能指向未映射的内存。
答案 3 :(得分:0)
这是未定义的行为,它无法执行任何操作,或者它可能会导致段违规