9

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

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

2 回答 2

18

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

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

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

不执行检查的原因operator[]是因为这正是[]原始数组和指针的工作方式。C/C++ 中没有用于访问原始数组/指针的完整性检查。你有责任检查它是否需要。

于 2012-10-15T13:44:39.260 回答
7

operator[]不会抛出异常。使用该at()行为的功能。

于 2012-10-15T13:37:38.567 回答