在 C++ 中基于范围的 for 循环中使用引用作为控制变量

dev*_*dev 4 c++ for-loop c++11

我一直在搞乱基于范围的 for 循环,就像这样:

\n\n
int a[] = {1, 2, 3, 4};\n\nfor(auto i : a){\n    cout << i;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

(如果我错了,请在这里纠正我)我想i在每次迭代开始时分配序列容器中的下一个值,a例如:

\n\n

i = a[0]\xe2\x80\xa6 迭代 1

\n\n

i = a[1]\xe2\x80\xa6 迭代 2

\n\n

\xe2\x80\xa6

\n\n

i = a[9]\xe2\x80\xa6 迭代 10

\n\n

我想问当循环控制变量是引用时这是如何工作的:

\n\n

for(int &i : a){...}

\n\n

i由于引用不是在初始化时分配而是绑定的,并且绑定永远不会改变,那么如何在给定迭代中a迭代保存元素的值a,但是当在声明中分配引用时,就像分配原始变量一样。要更改数组元素,我们必须使用引用,我的问题是如何将单个引用绑定到不同的变量(即a循环期间的元素),因为每个元素都可以在循环内使用相同的引用变量进行修改。

\n\n

谢谢

\n

P.W*_*P.W 5

我发现这篇内容丰富的文章可以帮助您:

我认为以下文章中的引用回答了您的问题:

在基于范围的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保留它们。