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

Why am I allowed to set end() for std::vector?

本文关键字:设置 end vector 为什么 允许我 std      更新时间:2023-10-16

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;
}

为什么允许这样做?

不是。您正在调用未定义的行为。此代码可以做任何事情,包括崩溃和打印2。

您不允许这样做。仅仅因为您的程序并不崩溃并不意味着它是允许的。也许当您向老板展示时,您的程序将在星期二崩溃。也许您写了2个变量。

这被称为不确定的行为,这意味着您无法期望任何特别的事情发生 - 您甚至无法期望崩溃。

这将肯定会导致问题,并且不允许标准(未定义的行为(。不幸的是,不可能编写一份编译器,以诊断所有可能违反标准的违规行为,因此,即使就标准而言,某些代码构造也是非法的。