C++ std::数组运算符[]vs get<&燃气轮机;
根据: get是在编译时强制执行的,而不是at()或运算符[] 现在我知道C++ std::数组运算符[]vs get<&燃气轮机;,c++,c++11,C++,C++11,根据: get是在编译时强制执行的,而不是at()或运算符[] 现在我知道at()进行边界检查,但我想知道get和[]之间的关键区别--操作符[]的页面没有说明索引的运行时强制执行,所以上面的引用可能不太准确 它们都采用大小类型并返回一个元素引用,那么这对于get来说“编译时强制”是什么意思?这意味着,如果您有一个大小为N的std::array,并且您尝试在其上调用get,那么程序将只在i处于边界时编译(0这意味着,如果您有一个大小为N的std::array,并且您尝试在其上调用get,则程序将
at()
进行边界检查,但我想知道get
和[]
之间的关键区别--操作符[]
的页面没有说明索引的运行时强制执行,所以上面的引用可能不太准确
它们都采用大小类型并返回一个元素引用,那么这对于
get
来说“编译时强制”是什么意思?这意味着,如果您有一个大小为N
的std::array
,并且您尝试在其上调用get
,那么程序将只在i
处于边界时编译(0这意味着,如果您有一个大小为N
的std::array
,并且您尝试在其上调用get
,则程序将仅在i
在边界内时编译(0在访问std::array
容器中的元素时,您基本上有三个选项:
在编译时被检查。如果索引不是constexpr或超出边界[0,n],则会出现编译时错误。例如,当您知道需要第一个元素时,应该使用它std::get(arr)
在运行时被检查。如果索引超出数组边界,则引发std::out\u of_range异常。这类似于Java/.NET的行为arr.at(index)
根本不检查。可能编译器在调试版本中执行,也可能不执行。如果索引在边界之外,则会出现未定义的行为,这意味着实际上所有赌注都是无效的,因此只有在完全确定索引在边界之内时才应使用它。这种情况的典型情况是遍历数组(索引范围从0到size-1),但为此,您今天将使用基于范围的arr[索引]
std::array
容器中的元素时,基本上有三个选项:
在编译时被检查。如果索引不是constexpr或超出边界[0,n],则会出现编译时错误。例如,当您知道需要第一个元素时,应该使用它std::get(arr)
在运行时被检查。如果索引超出数组边界,则引发std::out\u of_range异常。这类似于Java/.NET的行为arr.at(index)
根本不检查。可能编译器在调试版本中执行,也可能不执行。如果索引在边界之外,则会出现未定义的行为,这意味着实际上所有赌注都是无效的,因此只有在完全确定索引在边界之内时才应使用它。这种情况的典型情况是遍历数组(索引范围从0到size-1),但为此,您今天将使用基于范围的arr[索引]
get
是在编译时强制执行的,而操作符[]
@juanchopanza正是我在问题中所写的。你能进一步解释一下吗?关键区别在于get
是在编译时强制执行的,而不是操作符[]
@juanchopanza这正是我在问题中所写的内容。你能进一步解释吗?因此,如果编译时不知道i
,你就不能使用get
?@JXB是的,因为它是一个模板parameter@JXB还要注意,std::vector
没有get
,因为它的大小在编译时可能是未知的,如果编译时不知道i
,不能使用get
?@JXB yes,因为它是一个模板parameter@JXB还要注意,std::vector
没有get
,因为它的大小在编译时可能是未知的