为什么在 std::vector 中使用索引超出范围的运算符 [] 时没有出现异常?
Why I don't get an exception when using operator [] with index out of range in std::vector?
为什么当我使用以下代码时,我没有得到超出范围的异常?
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()
函数用于该行为。
相关文章:
- 对 r 值使用移动赋值运算符时的异常
- iostream运算符重载的C++异常规范
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 在重载运算符>>部分中收到异常
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- 动态指针引用数组由三元运算符返回值,但有异常
- 运算符重载时未处理<<异常
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?
- c++运算符=工作异常(函数内部输出正常,但返回后错误)
- C++隐式生成的赋值运算符的异常安全性
- C++:异常的运算符重载
- 为什么在 std::vector 中使用索引超出范围的运算符 [] 时没有出现异常?
- 如何在类数组中的运算符 [] 中捕获异常
- 是否可以从三元运算符引发异常
- 运算符重载未处理异常
- std::bad_alloc C++调用运算符 = 方法时引发的异常
- GCC 前缀增量运算符在将值传递给函数时行为异常
- 具有空异常规范的运算符new在分配返回0时调用构造函数
- std::istream 运算符异常重置/未抛出
- 全局关闭C++新运算符异常