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

问题描述 投票:4回答:2

根据cppref,重载目前不是noexcept指定的。但我认为他们实际上是noexcept,对吗?以来

  1. 不执行边界检查。所以没有像out_of_range那样的array::at异常。
  2. 如果输入超出边界,则会发生低级别段错误或访问冲突,这超出了C ++异常范围(我猜)。
c++ c++11 c++-standard-library noexcept
2个回答
8
投票

operator[]未标记为noexcept的原因是它具有“狭义契约”,即指数值必须在0 ... N-1范围内。如果传递的值不在该范围内,则不会定义行为,并且(谁知道?)函数可能会抛出。

关于不用“狭义契约”标记事物的标准是非常一致的。这被非正式地称为“拉科斯规则”。

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

[后来:事实证明,libc ++已经为stringstring_view做了这个,但不是vectorarraydeque]

[Sill后来:libc ++现在将operator[]标记为vector / arraydeque的noexcept。]


0
投票

该标准规定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;
© www.soinside.com 2019 - 2024. All rights reserved.