这样写的时候,会出现这样的错误。
Screen& dispaly(ostream& os) const {
os << contents;
return *this;
}
同样,这样写的时候也会出现
int main() {
const int a = 3;
int &b = a;}
可以这两者是相似的问题,那么我们来分析出错的具体原因。
在解决问题之前,首先复习下const的使用。
一、const使用
double a = 3;
const int &b = a;
此代码合法,a,b类型不匹配时,编译器生成临时对象并将常量绑定到该临时对象上。如下图:
const int temp=b;
const int &b=temp;
此处的temp就是编译器需要一个空间暂存表达式的求值结果时而临时创建的未命名对象。
因为const引用,其本身并不能修改绑定的对象,所以将其绑定到临时对象上也是可以的
在看下面的代码:
double a = 3;
int &b = a;//错误
这里是不能将b绑定到a的。如果类型不匹配,那么定义的引用会被绑定到一个临时对象上。而在完成对应的绑定操作时,实际上操作的是临时对象,并非初始化想要绑定的对象,那么就无法完成初始化。报错为下:
总之:
c++认为,使用普通引用绑定一个对象,就是为了能通过引用对这个对象做改变。如果普通引用绑定的是一个临时量而不是对象本身,那么改变的是临时量而不是希望改变的那个对象,这种改变是无意义的。所以规定普通引用不能绑定到临时量上。 那么为什么常量引用就可以呢,因为常量是不能改变的。也就是说,不能通过常量引用去改变对象,那么绑定的是临时量还是对象都无所谓了,反正都不能做改变也就不存在改变无意义的情况。
重新解决开始提出的问题。
[提示]:更一般的我们可以用顶层const表示任意是常量的对象。
int main() {
const int a = 3;
int &b = a;}//错误代码
在绑定过程中,const被丢弃(顶层const),即b被赋予int类型,由于引用可以修改(而a为const类型不可修改),所以此处报错。
Screen& dispaly(ostream& os) const {
os << contents;
return *this; }//在*处报错
那类似的,经过参数后const限定,this此时为 const Screen *const类型,那么*this就是const Screen 类型。而返回类型为 Screen&类型,所以在返回时丢弃掉了顶层const,导致报错。