C++ array::operator[]是否实际上没有异常?

C++ array::operator[]是否实际上没有异常?,c++,c++11,c++-standard-library,noexcept,C++,C++11,C++ Standard Library,Noexcept,根据,当前未指定重载。但我认为他们实际上并不例外,对吗?自 不执行边界检查。因此,不存在超出范围的异常 如果输入超出界限,发生低级分段错误或访问违规,超出C++异常范围(i猜测)。 标准为std::array的操作员[]规定了w.r.t: 26.3.7类模板数组[数组] 26.3.7.1类模板阵列概述 operator[]未标记为noexcept的原因是它有一个“窄合同”,即要求索引值在0的范围内。。。N-1。如果传递的值不在该范围内,则行为未定义,并且(谁知道呢?)函数可能会抛出 关于不将带有

根据,当前未指定重载。但我认为他们实际上并不例外,对吗?自

  • 不执行边界检查。因此,不存在超出范围的异常
  • 如果输入超出界限,发生低级分段错误或访问违规,超出C++异常范围(i猜测)。

  • 标准为
    std::array
    的操作员
    []
    规定了w.r.t:

    26.3.7类模板数组[数组]

    26.3.7.1类模板阵列概述


    operator[]
    未标记为
    noexcept
    的原因是它有一个“窄合同”,即要求索引值在
    0的范围内。。。N-1
    。如果传递的值不在该范围内,则行为未定义,并且(谁知道呢?)函数可能会抛出

    关于不将带有“狭义合同”的东西标记为不例外,标准是相当一致的。这被非正式地称为“拉科斯规则”

    请注意,如果标准没有指定,库实现者可以自由添加
    noexcept
    ,如果他们选择的话。我会考虑将其添加到libc++中

    [后来发现,libc++已经为
    string
    string\u视图
    执行了此操作,但没有为
    vector
    array
    deque
    ]


    [Sill later:libc++现在将
    操作符[]
    标记为
    向量
    /
    数组
    deque

    在libc++
    \u LIBCPP\u内联可见性\u LIBCPP\u CONSTEXPR\u之后的向量
    (大小类型){return elems\uuuuuuuu n}相比,说:
    \u LIBCPP\u INLINE\u VISIBILITY\u LIBCPP\u CONSTEXPR\u在CXX14迭代器begin()之后\u NOEXCEPT{return iterator(data());}
    。你为什么怀疑cppref?有趣的是,可能的重复似乎将两个
    操作符[]
    方法都标记为
    noexcept
    。拉科斯规则背后的原因是什么?正如我所理解的(对于Scott Meyers演示中的exmaple,但我现在找不到链接),
    noexcept
    函数也可能会中断(抛出或调用UB),但如果它们中断,则意味着整个程序无法从这种状态恢复。这就是未定义行为的作用-程序未定义,您无法恢复。区分这两者的原因是什么?
    noexcept
    是否被认为既不会抛出也不会调用UB?@Fureeish不使用限制标记函数noexcept允许实现者定义它将抛出,而不是UB的任何其他症状,这允许对该情况进行测试(否则,测试线束必须检测到它正在测试的
    std::terminate
    d)@Caleth当标准没有提到它抛出任何东西时,实现者如何定义它抛出一些东西?@Fureeish因为标准说任何东西都是允许的。不,我是说,如果一个行为没有被标准定义,它仍然可能被实现定义,并且根据定义它是该ci中允许的行为圆度
    namespace std {
    template <class T, size_t N>
    struct array {
    ...  
    
    // element access:
    constexpr reference operator[](size_type n);
    constexpr const_reference operator[](size_type n) const;
    
    constexpr T * data() noexcept;
    constexpr const T * data() const noexcept;