void f(vector<int> &v) { v[0]; // A v.at[0]; // B }
如果v非空,A行和B行沒有任何區別。如果v為空,B行會拋出std::out_of_range異常,A行的行為未定義。
c++標准不要求vector<T>::operator[]進行下標越界檢查,原因是為了效率,總是強制下標越界檢查會增加程序的性能開銷。設計vector是用來代替內置數組的,所以效率問題也應該考慮。不過使用operator[]就要自己承擔越界風險了。
如果需要下標越界檢查,請使用at。