在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;
}
答案 0 :(得分:3)
为什么允许这样做?
不是。您正在调用Undefined Behavior。此代码可以执行任何操作,包括崩溃和打印2.
答案 1 :(得分:1)
你不能这样做。仅仅因为你的程序没有崩溃并不意味着它被允许。也许你的节目会在周二向你的老板展示时崩溃。或者也许你写了2个其他变量。
这称为未定义的行为,这意味着您无法预料会发生任何事情 - 您甚至无法预料会发生崩溃。
答案 2 :(得分:0)
这将肯定导致问题,标准不允许(未定义的行为)。不幸的是,编写一个诊断每一个可能违反标准的编译器是不可能的,所以一些代码构造会编译,即使它们在标准方面是非法的。