为何选择int& const =& amp; r = 0是非法的r = 0合法吗?

时间:2015-12-30 07:40:39

标签: c++ pointers reference const

我是C ++的新手。我试图学习const的概念。有人可以告诉我为什么第一个声明是非法的,而第二个是合法的?

int i = -1, &r = 0;         

const int i = -1, &r = 0;  

4 个答案:

答案 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左值的成功,因为它被绑定(而不是直接)到右值。