dev*_*dev 4 c++ for-loop c++11
我一直在搞乱基于范围的 for 循环,就像这样:
\n\nint a[] = {1, 2, 3, 4};\n\nfor(auto i : a){\n cout << i;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n(如果我错了,请在这里纠正我)我想i在每次迭代开始时分配序列容器中的下一个值,a例如:
i = a[0]\xe2\x80\xa6 迭代 1
i = a[1]\xe2\x80\xa6 迭代 2
\xe2\x80\xa6
\n\ni = a[9]\xe2\x80\xa6 迭代 10
我想问当循环控制变量是引用时这是如何工作的:
\n\nfor(int &i : a){...}
i由于引用不是在初始化时分配而是绑定的,并且绑定永远不会改变,那么如何在给定迭代中a迭代保存元素的值a,但是当在声明中分配引用时,就像分配原始变量一样。要更改数组元素,我们必须使用引用,我的问题是如何将单个引用绑定到不同的变量(即a循环期间的元素),因为每个元素都可以在循环内使用相同的引用变量进行修改。
谢谢
\n我发现这篇内容丰富的文章可以帮助您:
我认为以下文章中的引用回答了您的问题:
在基于范围的
for循环中,auto&将创建对范围中原始元素的引用(复数)。
auto它还涵盖了基于范围的 for 循环的不同使用方式。
for (auto x : range)
Run Code Online (Sandbox Code Playgroud)
这将创建范围中每个元素的副本。因此,当您想要使用副本时,请使用此变体。
for (const auto x : range)
Run Code Online (Sandbox Code Playgroud)
使用const auto可能表明您想要使用每个元素的不可变副本。
for (auto& x : range)
Run Code Online (Sandbox Code Playgroud)
auto&当您想要修改非通用代码中的范围内的元素时使用。
for (const auto& x : range)
Run Code Online (Sandbox Code Playgroud)
const auto&当您想要对范围内的元素进行只读访问时使用,即使在通用代码中也是如此
for (auto&& x : range)
Run Code Online (Sandbox Code Playgroud)
auto&&当您想要修改通用代码中范围内的元素时使用
for (const auto&& x : range)
Run Code Online (Sandbox Code Playgroud)
此变体将仅绑定到右值,由于 const,您将无法修改或移动右值。这使它变得毫无用处。因此,没有理由选择此变体而不是const auto&。
for (decltype(auto) x : range) // C++14
Run Code Online (Sandbox Code Playgroud)
这意味着:应用自动类型推导,但使用decltype规则。而 auto 会删除顶级cv限定符和引用,并decltype保留它们。