字面量实例化对象的类引用绑定机制及代码运行原理问询
解释代码
struct A { A (int){std::cout<<'A';} }; const A& a = 3;的运行机制 你的假设完全正确!咱们一步步拆解这段代码的运行过程,把细节讲清楚:
类型不匹配的初始值:
你要绑定的const A& a是A类型的const左值引用,而初始值3是一个int类型的右值,两者类型不兼容,没法直接绑定。临时对象的物化:
这时候C++会触发临时物化转换——用int值3去调用A类的构造函数A(int),创建一个A类型的临时对象。这个构造函数执行时会输出字符A,这就是你看到控制台打印'A'的原因。const引用延长临时对象生命周期:
C++有个特殊规则:const左值引用可以绑定到临时对象上,并且会延长这个临时对象的生命周期,让它和引用a的生命周期保持一致。也就是说,这个临时A对象不会在这条语句结束后立刻销毁,而是会一直存在,直到引用a离开它的作用域(比如所在的函数执行完毕)。
额外补充个小细节:如果把代码改成A& a = 3;(去掉const),这段代码就会编译失败——因为非const的左值引用不能绑定到临时对象上,只有const左值引用或者右值引用(A&& a =3;)才允许这么做。
内容的提问来源于stack exchange,提问作者usfmohy
相关产品推荐
相关产品推荐

