为什么我允许为std :: vector设置end()?

时间:2017-05-01 23:28:56

标签: c++ pointers memory vector

end()的标准库实现中,除了能够检索它之外,我还能够设置过去的结束值。为什么允许这样做?这不可能导致问题吗?

#include <vector>
#include <iostream>


int main(void)
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    *v.end() = 2;    // why am I allowed to do this?
    std::cout << *v.end() << std::endl;

    return 0;
}

3 个答案:

答案 0 :(得分:3)

  

为什么允许这样做?

不是。您正在调用Undefined Behavior。此代码可以执行任何操作,包括崩溃和打印2.

答案 1 :(得分:1)

你不能这样做。仅仅因为你的程序没有崩溃并不意味着它被允许。也许你的节目会在周二向你的老板展示时崩溃。或者也许你写了2个其他变量。

这称为未定义的行为,这意味着您无法预料会发生任何事情 - 您甚至无法预料会发生崩溃。

答案 2 :(得分:0)

这将肯定导致问题,标准不允许(未定义的行为)。不幸的是,编写一个诊断每一个可能违反标准的编译器是不可能的,所以一些代码构造会编译,即使它们在标准方面是非法的。