为什么当我使用下面的代码时,我没有得到超出范围的异常?
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()
行为的功能。