std::vector:为什么没有发生 out_of_range 错误?

问题描述 投票:0回答:1

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!

我预计会出现超出范围的异常,但它没有发生。为什么?

c++ vector stdvector clang++
1个回答
0
投票

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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.