std::数组运算符[] vs get<>

std::array operator[] vs get<>

本文关键字:lt gt get 数组 运算符 std vs      更新时间:2023-10-16

根据cppreference.com:

get&lt;>在编译时执行,而不是AT()或操作员[]。

现在,我知道at()确实进行了检查,但是我想知道get[]之间的关键区别 - operator[]的页面对索引的运行时执行一无所知,因此上面的引文也许不太准确。

他们都采用size_type并返回元素参考,那么get的"在编译时间执行"是什么意思?

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

  • std::get<index>(arr)在编译时检查。如果索引不是constexpr或在范围内[0,n)之外,则会获得编译时错误。例如,当您知道想要第一个元素时,应该使用它。
  • 在运行时检查arr.at(index)。如果索引在数组范围之外,则抛出std :: out_of_range异常。这类似于Java/.net的行为。
  • 根本没有检查arr[index]。也许您的编译器可以在调试构建中做到这一点,或者不做。如果索引在范围之外,您会得到不确定的行为,这意味着从字面上看,所有赌注都关闭了,因此只有在完全确定索引在范围内时才能使用它。为此的规范案例正在穿越数组(索引从0到size-1),但为此,您将使用基于范围的for

这意味着如果您的std::array大小 N,并且尝试在其上调用get<i>,则只有在i是内部(0&lt; = i&lt&lt)时,该程序才会编译; N)。鉴于,对于operator[],越野访问的结果是不确定的行为;编译器可能无法为您捕获。