以下代码可以编译和运行。 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是const引用?例如,以下代码无法编译。
#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'
两种情况有何不同?
答案 0 :(得分:2)
在第一种情况下,您要分配给全局变量a
。 n
之所以会更改,是因为它是对可变全局变量的引用。允许更改a
,但禁止直接更改n
。
在第二种情况下,您尝试重新分配const
参数a
。禁止这样做,因为a
是const
。
您要做的是使用局部变量的shadow global variable a
。在第二个示例中,在foo
中不存在名为a
的全局变量,而是有一个使用该名称的参数。