#include
using namespace std;
int main() {
int a = 2;
int c = 2;
int & b = a++;
int & d = ++c;
cout<<a<<","<<b<<endl;
cout<<c<<","<<d<<endl;
}
如上面代码所示,为什么b引用的初始化会编译通不过,d引用的定义确没有提示编译错误?
按我理解
int & b = a++;应该相当于下面两句:
int & b =a;
a=a+1;
所以我觉得编译应该通得过,但实际上不行,所以请各位大神指正一下。
非常量引用的初始值必须为左值,i++ 不可以作为左值;
++i 可以作为左值。
int main()
{
int i = 9;
//i++ = 10;
++i = 10;
return 0;
}
非常量引用的初始值必须为左值,i++ 不可以作为左值;
++i 可以作为左值。
int main()
{
int i = 9;
//i++ = 10;
++i = 10;
return 0;
}
首先,你需要弄明白c++是如何实现前置自增与后置自增的。
//前置式,累加后取出
UPInt& UPInt::operator++()
{
*this+=1; //累加
return *this; //取出
}
//后置式,取出后累加
const UPInt upInt::operator++(int)
{
UPInt oldVlaue=*this; //取出
++(*this); //累加
return oldVlaue;
}
后置自增,返回的一个局部变量,之后局部变量也就不见了,把一个不存在的内存赋与引用显然不正确。而且返回的值是const,把一个const变量赋值给一个非const引用也是不正确的,在VS2008下把int & b = a++改为const int & b = a++;可以编译通过,但是在下面增加一个语句a+=1;把a与b的值打印出来,它们的值是不相同的,说明b并不是指向a的内存区域,我们可以通过打印出a与b的地址可以看出来。
前置自增与后置自增显然是不相同的,返回值是一个引用而且是它本身,这样赋值给一个引用当然是可以的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。