*(vec.begin() - 1)应该返回什么?

时间:2016-03-25 06:04:27

标签: c++

假设我有以下代码:

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吗?或者这是未定义的行为?

2 个答案:

答案 0 :(得分:5)

行为将是未定义的。 如果您阅读了不拥有的记忆,则无法阻止您。所以你可以阅读但是,你无法控制该区域,即谁在写这个区域?所以行为将是不确定的。
但是如果你试着写*(test.begin()-1),如果你的操作系统正在保护该区域,你就会遇到错误。

答案 1 :(得分:1)

test.begin() - 1导致未定义的行为(即使没有解除引用)。

根据C ++标准部分[random.access.iterators] / 1中随机访问迭代器的-运算符的定义,这相当于--test.begin()

前缀 - --的行为由[bidirectional.iterators] / 1描述,它具有:

  

--r 断言/注释前/后条件前:存在sr == ++s

但是s没有++s == test.begin(),所以这个先决条件不成立;因此行为未定义。