C++ array::operator[]是否实际上没有异常?
根据,当前未指定重载。但我认为他们实际上并不例外,对吗?自C++ array::operator[]是否实际上没有异常?,c++,c++11,c++-standard-library,noexcept,C++,C++11,C++ Standard Library,Noexcept,根据,当前未指定重载。但我认为他们实际上并不例外,对吗?自 不执行边界检查。因此,不存在超出范围的异常 如果输入超出界限,发生低级分段错误或访问违规,超出C++异常范围(i猜测)。 标准为std::array的操作员[]规定了w.r.t: 26.3.7类模板数组[数组] 26.3.7.1类模板阵列概述 operator[]未标记为noexcept的原因是它有一个“窄合同”,即要求索引值在0的范围内。。。N-1。如果传递的值不在该范围内,则行为未定义,并且(谁知道呢?)函数可能会抛出 关于不将带有
标准为
std::array
的操作员[]
规定了w.r.t:
26.3.7类模板数组[数组]
26.3.7.1类模板阵列概述
operator[]
未标记为noexcept
的原因是它有一个“窄合同”,即要求索引值在0的范围内。。。N-1
。如果传递的值不在该范围内,则行为未定义,并且(谁知道呢?)函数可能会抛出
关于不将带有“狭义合同”的东西标记为不例外,标准是相当一致的。这被非正式地称为“拉科斯规则”
请注意,如果标准没有指定,库实现者可以自由添加noexcept
,如果他们选择的话。我会考虑将其添加到libc++中
[后来发现,libc++已经为string
和string\u视图
执行了此操作,但没有为vector
、array
或deque
]
[Sill later:libc++现在将
操作符[]
标记为向量
/数组
和deque
”在libc++\u LIBCPP\u内联可见性\u LIBCPP\u CONSTEXPR\u之后的向量
(大小类型){return elems\uuuuuuuu n}相比,说:\u LIBCPP\u INLINE\u VISIBILITY\u LIBCPP\u CONSTEXPR\u在CXX14迭代器begin()之后\u NOEXCEPT{return iterator(data());}
。你为什么怀疑cppref?有趣的是,可能的重复似乎将两个操作符[]
方法都标记为noexcept
。拉科斯规则背后的原因是什么?正如我所理解的(对于Scott Meyers演示中的exmaple,但我现在找不到链接),noexcept
函数也可能会中断(抛出或调用UB),但如果它们中断,则意味着整个程序无法从这种状态恢复。这就是未定义行为的作用-程序未定义,您无法恢复。区分这两者的原因是什么?noexcept
是否被认为既不会抛出也不会调用UB?@Fureeish不使用限制标记函数noexcept允许实现者定义它将抛出,而不是UB的任何其他症状,这允许对该情况进行测试(否则,测试线束必须检测到它正在测试的std::terminate
d)@Caleth当标准没有提到它抛出任何东西时,实现者如何定义它抛出一些东西?@Fureeish因为标准说任何东西都是允许的。不,我是说,如果一个行为没有被标准定义,它仍然可能被实现定义,并且根据定义它是该ci中允许的行为圆度
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;
constexpr T * data() noexcept;
constexpr const T * data() const noexcept;