std :: array operator [] vs get<>

时间:2016-06-21 20:48:46

标签: c++ c++11

根据cppreference.com

  

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

现在我了解at()确实会检查,但我想知道get[]之间的主要区别 - operator[]的页面没有说明关于索引的运行时执行,所以上面的引用可能不太准确。

它们都接受一个size_type并返回一个元素引用,那么这个“在编译时强制执行”对于get是什么意思?

2 个答案:

答案 0 :(得分:5)

这意味着,如果您的std::array大小为N,并且您尝试在其上调用get<i>,则只有在i处于以下情况时,该程序才会进行编译:边界(0 <= i&lt; N)。然而,对于operator[],越界访问的结果是未定义的行为;编译器可能无法为您捕获它。

答案 1 :(得分:4)

在访问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