Ваш пример не оптимален для понимания базового поведения, попробуйте что-то вроде:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void reference()
{
cout << "reference" << endl;
vector <int> arr {12,13,14,15,16};
for (auto& x: arr)
++x;
for (const auto& x : arr)
cout << x << endl;
}
void value()
{
cout << "value" << endl;
vector <int> arr {12,13,14,15,16};
for (auto x: arr)
++x;
for (const auto& x : arr)
cout << x << endl;
}
int main()
{
value();
reference();
return 0;
}
Теперь результат будет:
value
12
13
14
15
16
reference
13
14
15
16
17
Как вы можете видеть, в в контрольном случае значения внутри векторов изменяются напрямую, потому что вы зацикливаетесь на vector
, используя ссылки, так что x
локально по отношению к l oop является ссылкой на фактическое значение внутри vector
(а не копия, что происходит по значению).
Таким образом, любая модификация отражается на исходном элементе.