array::operator[]实际上是noexcept吗?
Is array::operator[] actually noexcept?
根据 cppref,当前 noexcept
未指定重载。但我认为他们实际上是noexcept
,对吧?自
- 不执行边界检查。所以没有像
array::at
. 这样的 out_of_range
异常
- 如果输入越界,就会发生低级段错误或访问冲突,这超出了 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++ 已经为 string
和 string_view
做了这件事,但没有为 vector
、array
或 deque
]
[稍后:libc++ 现在将 operator[]
标记为 noexcept for vector
/array
和 deque
。]
根据 cppref,当前 noexcept
未指定重载。但我认为他们实际上是noexcept
,对吧?自
- 不执行边界检查。所以没有像
array::at
. 这样的 - 如果输入越界,就会发生低级段错误或访问冲突,这超出了 C++ 异常范围(我猜)。
out_of_range
异常
标准声明 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++ 已经为 string
和 string_view
做了这件事,但没有为 vector
、array
或 deque
]
[稍后:libc++ 现在将 operator[]
标记为 noexcept for vector
/array
和 deque
。]