Gotchas 44-引用和临时对象
摘要:
1)“引用必须用左值来初始化”基本上着意味着引用的初始化物必须具有一个地址,也有一个值(→常见错误6)。不过谈及指向常量的引用时,事情就开始变得复杂了。指向常量的引用仍然必须用左值来初始化,不过编译器很乐意——在特定的情况下——为此从一个非左值出发来创建一个左值(临时对象):
const int &r3=12;//没问题
引用r3指向编译器隐式分配内存并创建的匿名int类型对象。一般情况下,这种编译器的生存期持续到权表达式结束处①。不过“在这种特例下,标准网开一面,保证临时对象会和以其为初始化物的引用共存亡”。“请注意该对象与以其为初始化物的引用之间并无联接纽带”。②
2)“编译器还会为身为左值的初始化物产生临时对象。并与这个引用(声明时)指向的类型不一样:”
const string &name="Fread";//没问题
short s=123;
const int &r4=s;//没问题
s=345;//r4的值仍是123③
const int *ip=&r4;//并非s的地址
“此处的初始化物只是个临时的匿名对象,而非源代码中显示写明的那个变量。”
=====================================================
注释:
①参看string类的c_str成员函数的用法。
②万幸下面这段居心叵测的代码不会改变字面常量12的意义:
const_cast<int &>(r3)=11;//赋值给那个匿名对象或程序直接崩溃。
③const int类型的引用r4关联的只是那个编译器创建的临时对象
作者:zhanjindong
出处:http://www.cnblogs.com/zhanjindong
个人博客:http://zhanjindong.com
关于:一个程序员而已
说明:目前的技术水平有限,博客定位于学习心得和总结。
出处:http://www.cnblogs.com/zhanjindong
个人博客:http://zhanjindong.com
关于:一个程序员而已
说明:目前的技术水平有限,博客定位于学习心得和总结。