Для чего нужен амперсанд в параметре функции?

Подскажите пожалуйста какую роль играет амперсанд в параметре данной функции т.к программа работает корректно как с ним так и без него

#include <iostream>
#include <vector>

using namespace std;
typedef vector<int>  T_summands;  

void  print_summands(int n_start,const T_summands& summands)
{
    cout << n_start << "=";
    for(T_summands::const_iterator  summands_it = summands.begin(); summands_it != summands.end(); ++summands_it)
    {
        cout << *summands_it << (summands_it != summands.end() - 1 ? " + " : "\n");
    }
}  

Ответы (1 шт):

Автор решения: Harry

Для понимания - ну, считайте, что при передаче по ссылке вы просто передаете указатель, но вам не нужно все время его разыменовывать.

Типа

void f(int * x) { *x = *x * 2; }
...
int y = 4;
f(&y);

То же через ссылку -

void f(int& x) { x = x * 2; }
...
int y = 4;
f(y);

Это, конечно, приближение, но для понимания годится.

Когда вы передаете без ссылки, по значению - создается копия. Примерно так:

void f(int x) { x = x * 2; } 

это как если бы (неточно! просто для понимания!!)

void f(int * y) 
{
    int x;
    x = *y;

    x = x * 2;
}

На "бытовом" уровне - переданное по значению не меняет то, что передано, по ссылке - меняется сама переданная переменная.

void f(int& x) { x = x * 2; }
...
int y = 4;
f(y);  // Теперь y == 8


void f(int x) { x = x * 2; }
...
int y = 4;
f(y);  // y == 4...
→ Ссылка