GET<>在编译时强制执行,而不是at()或operator []。
现在我了解at()
确实会检查,但我想知道get
和[]
之间的主要区别 - operator[]
的页面没有说明关于索引的运行时执行,所以上面的引用可能不太准确。
它们都接受一个size_type并返回一个元素引用,那么这个“在编译时强制执行”对于get
是什么意思?
答案 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
。