Mac M1。
clang++ --version
Apple clang version 16.0.0 (clang-1600.0.26.4)
Target: arm64-apple-darwin24.0.0
Thread model: posix
我的代码:
#include <iostream>
#include <vector>
int main(){
try{
std::vector<int> items;
constexpr int size = 5;
for(int i = 0; i < size; ++i){
items.push_back(i * 10);
}
for(int i = 0; i <= items.size(); ++i){ // out of range
std::cout << i << " -> " << items[i] << std::endl;
}
std::cout << "Success!" << std::endl;
}
catch (std::out_of_range){ // I've expected to get it.
std::cerr << "Range error!" << std::endl;
}
}
编译命令:
clang++ -std=c++20 main.cpp
结果:
./a.out
0 -> 0
1 -> 10
2 -> 20
3 -> 30
4 -> 40
5 -> 0
Success!
我预计会出现超出范围的异常,但它没有发生。为什么?
std::vector
的 operator[]
不会对索引执行任何有效性检查。如果超出范围,则违反了 operator[]
的先决条件,因此是未定义的行为。
std::vector
还有 .at
成员函数,它没有索引在界内的前提条件,而是在索引不在界内时抛出 std::out_of_bounds
异常。看来你想用它:
for(int i = 0; i <= items.size(); ++i){ // out of range
std::cout << i << " -> " << items.at(i) << std::endl;
}