std :: array operator [] vs get <>

Jer*_*dge 0 c++ c++11

根据cppreference.com:

get <>在编译时强制执行,而不是at()或operator [].

现在我明白了at()边界检查,但我想知道get和之间的关键区别[]- 页面operator[]没有说明索引的运行时执行,所以上面的引用可能不太准确.

它们都采用size_type并返回一个元素引用,那么这个"在编译时强制执行"是get什么意思呢?

Jav*_*tín 7

在访问std::array<T,n>容器中的元素时,您基本上有三种选择:

  • std::get<index>(arr)在编译时检查。如果索引不是 constexpr 或超出范围 [0,n),则会出现编译时错误。例如,当您知道需要第一个元素时就应该使用它。
  • arr.at(index)在运行时检查。如果索引在数组边界之外,则抛出 std::out_of_range 异常。这类似于 Java/.NET 的行为。
  • arr[index]根本没有检查。也许您的编译器在调试版本中执行此操作,也可能不执行。如果索引超出范围,您会得到未定义的行为,这意味着实际上所有赌注都已关闭,因此您应该只在完全确定您的索引在范围内时使用它。对此的规范情况是遍历数组(索引从 0 到大小 1),但为此您for今天将使用基于范围的。


Bri*_*ian 5

这意味着如果你有一个std::array大小N,并且你试图调用get<i>它,程序将只i在入境时编译(0 <= i< N).然而,对于operator[],越界访问的结果是未定义的行为; 编译器可能无法为您捕获它.

  • @JXB是的,因为它是模板参数 (2认同)