array::operator[]实际上是noexcept吗?

Is array::operator[] actually noexcept?

根据 cppref,当前 noexcept 未指定重载。但我认为他们实际上是noexcept,对吧?自

  1. 不执行边界检查。所以没有像 array::at.
  2. 这样的 out_of_range 异常
  3. 如果输入越界,就会发生低级段错误或访问冲突,这超出了 C++ 异常范围(我猜)。

标准声明 w.r.t 到运算符 [] for std::array:

26.3.7 Class template array [array]

26.3.7.1 Class template array overview [array.overview]

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;

正如我们所见,它们 不是 noexcept

data() 等成员已明确标记 noexcept

constexpr T * data() noexcept;
constexpr const T * data() const noexcept;

之所以operator[]没有标记为noexcept是因为它有一个"narrow contract",即要求索引值在0 ... N-1范围内.如果传递的值不在该范围内,则行为未定义,并且(谁知道?)函数可能会抛出异常。

关于不将带有 "narrow contracts" 的东西标记为 noexcept 的标准非常一致。这被非正式地称为 "the Lakos rule".

请注意,如果图书馆实施者选择,他们可以在标准未指定的地方自由添加 noexcept。我会考虑将其添加到 libc++。

[后来:事实证明 libc++ 已经为 stringstring_view 做了这件事,但没有为 vectorarraydeque]

[稍后:libc++ 现在将 operator[] 标记为 noexcept for vector/arraydeque。]