对于每个cppref,当前未指定重载noexcept
。但我认为它们实际上是noexcept
,对吗?自
array::at
这样的out_of_range
例外。答案 0 :(得分:8)
operator[]
未标记为noexcept
的原因是它具有“窄合约”,即索引值必须在0 ... N-1
范围内。如果传递的值不在该范围内,则行为未定义,并且该函数可能会抛出(谁知道?)。
该标准非常一致,即不将带有“窄合同”的内容标记为noexcept。这被非正式地称为“拉科斯规则”。
请注意,库IMPLEMENTERS可以自由选择在标准未指定的地方添加noexcept
。我会考虑将其添加到libc ++。
[后来:事实证明libc ++已经为string
和string_view
做过这项工作,但不是vector
,array
或deque
]
[稍后再说:libc ++现在将operator[]
/ vector
和array
标记为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;