是array :: operator []实际上没有例外吗?

时间:2019-03-14 03:51:04

标签: c++ c++11 c++-standard-library noexcept

对于每个cppref,当前未指定重载noexcept。但我认为它们实际上是noexcept,对吗?自

  1. 不执行边界检查。因此,没有array::at这样的out_of_range例外。
  2. 如果输入超出范围,则会发生低级段错误或访问冲突,这超出了C ++异常范围(我想)。

2 个答案:

答案 0 :(得分:8)

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

该标准非常一致,即不将带有“窄合同”的内容标记为noexcept。这被非正式地称为“拉科斯规则”。

请注意,库IMPLEMENTERS可以自由选择在标准未指定的地方添加noexcept。我会考虑将其添加到libc ++。

[后来:事实证明libc ++已经为stringstring_view做过这项工作,但不是vectorarraydeque]

[稍后再说:libc ++现在将operator[] / vectorarray标记为deque为no。]

答案 1 :(得分:0)

[]的标准向操作者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;