为什么在 std::vector 中使用索引超出范围的运算符 [] 时没有出现异常?

Why I don't get an exception when using operator [] with index out of range in std::vector?

本文关键字:运算符 异常 范围 vector 为什么 索引 std      更新时间:2023-10-16

为什么当我使用以下代码时,我没有得到超出范围的异常?

std::vector<int> v;
v.resize(12);
int t;
try {
    t = v[12];
} catch(std::exception  e){
    std::cout<<"error:"<<e.what()<<"n";
}
通过使用

operator[],你实际上是在告诉编译器"我知道我在做什么。相信我。如果您访问数组之外的某些元素,那是您的错。你违反了这种信任;你不知道你在做什么。

另一种方法是使用 at() 方法。在这里,您要求编译器对您的访问进行健全性检查。如果他们超出界限,你会得到一个例外。

这种健全性检查可能很昂贵,特别是如果它是在一些深度嵌套的循环中完成的。如果您知道索引将始终在边界内,则没有理由进行这些健全性检查。拥有一个不进行这些健全性检查的界面真是太好了。

使operator[]成为不执行检查的原因是,这正是[]对原始数组和指针的工作方式。C/C++ 中没有用于访问原始数组/指针的健全性检查。检查是否需要,责任在于您。

operator[]不会引发异常。将at()函数用于该行为。