Передача глобальных переменных в качестве константной ссылки - PullRequest
0 голосов
/ 08 апреля 2019

Следующий код компилируется и работает.Значения, отображаемые как a, так и n, равны 4.

#include <iostream>
using namespace std;

int a = 2;

void foo(int const&n)
{
    a = n*2;
    cout<<"a = "<<a<<"  n = "<<n<<endl;
}

int main()
{
    foo(a);
}
OUTPUT: a = 4  n = 4

Почему компилятор не жалуется, что n является константной ссылкой?Например, следующий код не может быть скомпилирован.

#include <iostream>

using namespace std;

int a = 2;

void foo(int const&a)
{
    a = a*2;
    cout<<"a = "<<a<<endl;
}

int main()
{
    foo(a);
}
OUTPUT:  In function 'void foo(const int&)':
10:7: error: assignment of read-only reference 'a'

Чем отличаются эти два случая?

1 Ответ

2 голосов
/ 08 апреля 2019

В первом случае вы присваиваете глобальной переменной a. n изменяется, потому что это ссылка на изменяемую глобальную переменную. Изменение a разрешено, но прямое изменение n запрещено.

Во втором случае вы пытаетесь переназначить аргумент const a. Это запрещено, поскольку a является const.

Что вы сделали, это теневая глобальная переменная a с локальной переменной. Во втором примере в foo глобальная переменная с именем a не существует, вместо этого есть аргумент, который занимает это имя.

...