为什么GCC实现的std::vector operator[]检测为noexcept与cppreference标注不符
差异原因说明
该现象是C++标准规定和具体标准库实现的自由度共同导致的,具体原因如下:
- cppreference标注的是C++标准强制要求的函数签名,目前C++标准没有强制规定
std::vector::operator[]必须携带noexcept说明符,因此页面上不会标注该说明符。 - 你使用的GCC配套标准库libstdc++,在实现时额外为
std::vector::operator[]添加了noexcept说明。C++标准明确允许标准库实现为没有强制noexcept要求的接口添加更严格的异常说明,只要不改变符合标准的程序的行为即可,因此该实现完全合规。 - 从功能逻辑来看,普通类型的
std::vector<T>的operator[]仅执行底层指针偏移+解引用操作,越界访问属于未定义行为,不会触发标准定义的异常抛出,本身就不存在抛出异常的可能,因此实现为noexcept是完全合理的。即便开启调试模式,operator[]内的越界检查触发的是断言失败,会直接调用abort()终止程序,不属于C++异常抛出逻辑,不会影响noexcept的判定结果。 - 唯一的例外是特化版本
std::vector<bool>,它的operator[]返回的是代理对象,有可能存在抛出异常的逻辑,此时noexcept检测结果可能为false。
你使用的noexcept检测写法是正确的,返回结果准确反映了当前编译环境下std::vector<float>::operator[]的异常说明特性,不属于编译器bug或者标准违反。
内容的提问来源于stack exchange,提问作者Aisec Nory
相关产品推荐
相关产品推荐

