在C/C++ 中,相似类型的隐式类型转换要生成一个临时变量,而临时变量具有常属性,如果这时候再使用一个变量来引用这个具有常属性的临时变量,就会报错,如下:
为什么呢?引用的本质是取别名,隐式类型转化生成的临时变量就有常属性,使用 int 类型的变量对这个临时变量取别名,就会导致权限放大,这是不允许的,如果使用 const 修饰的 int 类型的变量来引用则是没问题的。
字符串隐式类型转化为 string 类型的时候也会出现这种问题
“1234”是字符串,可以隐式类型转化为string对象,但隐式类型转换就会产生一个临时对象,s1引用,不是对 “1234”引用,而是对“1234”产生的临时对象引用,所以就必须加 const 来修饰。
父类引用子类的时候却不会出错,按理来说,Student 类型的 s 赋值给 Person,要先进行隐式类型的转换,生成临时对象,但此处没有加 const 修饰,却也没有报错。
C++对此处进行了处理,p会变成子类对象中父类的那部分的别名,而并不是生成临时对象。
但是,下面这样就不行了:
匿名对象本身就是临时对象,也不存在什么特殊规则了
改为 const 修饰就正常了。