我是C ++的新手。我试图学习const的概念。有人可以告诉我为什么第一个声明是非法的,而第二个是合法的?
int i = -1, &r = 0;
const int i = -1, &r = 0;
答案 0 :(得分:7)
i
在这里是一个红色鲱鱼,问题是int &r = 0;
与const int &r = 0;
非const左值引用必须直接绑定到左值。 0
不是左值,因此int &r = 0;
失败。
const lvalue引用可以绑定到rvalue。发生这种情况时,它不会直接绑定。相反,创建临时(此处为const int
类型)并从右值进行复制初始化。由于这种约束,临时性的寿命得以延长。
因此const int &r = 0;
是合法的,与const int __temp = 0; const int &r = __temp;
答案 1 :(得分:3)
int i = -1, &r = 0;
与:
int i = -1;
int &r = 0;
这里的问题是你不能写int &r = 0;
,因为引用的初始化需要初始化器是一个左值(一个对象的地址)
你可以参加),而文字0
不是。
但const引用的初始值设定项不必是左值,因此const int &r = 0;
没问题。
答案 2 :(得分:2)
i = -1,
位创建一个初始化为i
的{{1}}变量,但对后来的参考没有任何影响,所以让我们关注:
-1
int &r = 0; // illegal
const int &r = 0;
版本的作用是延长它所绑定的值的生命周期:换句话说,const int&
值会保留,以便通过0
使用,直到定义r
的范围结束。
很容易指出同样的慷慨没有扩展到r
版"因为它不是左值" 。 C++ FAQ中讨论了 为什么 这个更有趣的问题:
在C ++中,非const引用可以绑定到lvalues,const引用可以绑定到lvalues或rvalues,但是没有任何东西可以绑定到非const rvalue。这样可以保护人们不会改变在使用新值之前被摧毁的临时值。例如:
int&
如果允许那个incr(0)要么暂时没有人看到会增加或者 - 更糟糕 - 0的值将变为1.后者听起来很愚蠢,但实际上有一个类似早期Fortran的错误预留内存位置以保存值0的编译器。
答案 3 :(得分:1)
int i = -1, &r = 0;
基本上等同于写作
int i = -1;
int &r = 0
第二个语句尝试将非const
左值绑定到0
,这根本不是左值(0
不是可以获取其地址的对象)。但是,它是const
左值的成功,因为它被绑定(而不是直接)到右值。