假设我有以下代码:
std::vector<int> test;
test.push_back(10);
test.push_back(20);
test.push_back(30);
printf("%d\n", *(test.begin() - 1));
test.begin()保证返回之前的迭代器是什么?它总是0吗?或者这是未定义的行为?
答案 0 :(得分:5)
行为将是未定义的。 如果您阅读了不拥有的记忆,则无法阻止您。所以你可以阅读但是,你无法控制该区域,即谁在写这个区域?所以行为将是不确定的。
但是如果你试着写*(test.begin()-1)
,如果你的操作系统正在保护该区域,你就会遇到错误。
答案 1 :(得分:1)
test.begin() - 1
导致未定义的行为(即使没有解除引用)。
根据C ++标准部分[random.access.iterators] / 1中随机访问迭代器的-
运算符的定义,这相当于--test.begin()
。
前缀 - --
的行为由[bidirectional.iterators] / 1描述,它具有:
--r
断言/注释前/后条件前:存在s
,r == ++s
但是s
没有++s == test.begin()
,所以这个先决条件不成立;因此行为未定义。