void f(vector &v)
{
v[0]; // A
v.at[0]; // B
}
如果v非空,A行和B行没有任何区别。如果v为空或者下标越界,B行会抛出std::out_of_range异常,A行的行为未定义。
c++标准不要求vector::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用operator[]就要自己承担越界风险了。
如果需要下标越界检查,请使用at。