Fork me on GitHub

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关联的只是那个编译器创建的临时对象

posted @ 2012-09-30 17:14  zhanjindong  阅读(313)  评论(0编辑  收藏  举报
TOP