根据cppref,重载目前不是noexcept
指定的。但我认为他们实际上是noexcept
,对吗?以来
out_of_range
那样的array::at
异常。operator[]
未标记为noexcept
的原因是它具有“狭义契约”,即指数值必须在0 ... N-1
范围内。如果传递的值不在该范围内,则不会定义行为,并且(谁知道?)函数可能会抛出。
关于不用“狭义契约”标记事物的标准是非常一致的。这被非正式地称为“拉科斯规则”。
请注意,如果他们选择,库IMPLEMENTERS可以自由添加标准未指定的noexcept
。我会考虑将其添加到libc ++中。
[后来:事实证明,libc ++已经为string
和string_view
做了这个,但不是vector
,array
或deque
]
[Sill后来:libc ++现在将operator[]
标记为vector
/ array
和deque
的noexcept。]
该标准规定w.r.t为运营商[]
为std::array
:
26.3.7类模板数组[array]
26.3.7.1类模板数组概述[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;