Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::数组运算符[]vs get<&燃气轮机;_C++_C++11 - Fatal编程技术网

C++ std::数组运算符[]vs get<&燃气轮机;

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,则程序将

根据:

get是在编译时强制执行的,而不是at()或运算符[]

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


它们都采用大小类型并返回一个元素引用,那么这对于
get
来说“编译时强制”是什么意思?

这意味着,如果您有一个大小为
N
std::array
,并且您尝试在其上调用
get
,那么程序将只在
i
处于边界时编译(0这意味着,如果您有一个大小为
N
std::array
,并且您尝试在其上调用
get
,则程序将仅在
i
在边界内时编译(0在访问
std::array
容器中的元素时,您基本上有三个选项:

  • std::get(arr)
    在编译时被检查。如果索引不是constexpr或超出边界[0,n],则会出现编译时错误。例如,当您知道需要第一个元素时,应该使用它
  • arr.at(index)
    在运行时被检查。如果索引超出数组边界,则引发std::out\u of_range异常。这类似于Java/.NET的行为
  • arr[索引]
    根本不检查。可能编译器在调试版本中执行,也可能不执行。如果索引在边界之外,则会出现未定义的行为,这意味着实际上所有赌注都是无效的,因此只有在完全确定索引在边界之内时才应使用它。这种情况的典型情况是遍历数组(索引范围从0到size-1),但为此,您今天将使用基于范围的

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

  • std::get(arr)
    在编译时被检查。如果索引不是constexpr或超出边界[0,n],则会出现编译时错误。例如,当您知道需要第一个元素时,应该使用它
  • arr.at(index)
    在运行时被检查。如果索引超出数组边界,则引发std::out\u of_range异常。这类似于Java/.NET的行为
  • arr[索引]
    根本不检查。可能编译器在调试版本中执行,也可能不执行。如果索引在边界之外,则会出现未定义的行为,这意味着实际上所有赌注都是无效的,因此只有在完全确定索引在边界之内时才应使用它。这种情况的典型情况是遍历数组(索引范围从0到size-1),但为此,您今天将使用基于范围的

关键区别在于
get
是在编译时强制执行的,而
操作符[]
@juanchopanza正是我在问题中所写的。你能进一步解释一下吗?关键区别在于
get
是在编译时强制执行的,而不是
操作符[]
@juanchopanza这正是我在问题中所写的内容。你能进一步解释吗?因此,如果编译时不知道
i
,你就不能使用
get
?@JXB是的,因为它是一个模板parameter@JXB还要注意,
std::vector
没有
get
,因为它的大小在编译时可能是未知的,如果
编译时不知道i
,不能使用
get
?@JXB yes,因为它是一个模板parameter@JXB还要注意,
std::vector
没有
get
,因为它的大小在编译时可能是未知的