【摘录】引用是别名而并非指针
摘自《C++ Common Knowledge》
人们常常会将指针和引用混淆,原因大概在于C++编译器通常采用指针的方式实现引用,但引用其实不是指针,其行为和指针并不相同。
引用和指针存在三大区别:
一,不存在空引用;
int &a=*static_cast<int*>(0); //错误
二,所有引用都要初始化;
三,一个引用永远指向用来对他初始化的那个对象
一个指向非常量的引用是不可以用字面常量或临时值进行初始化的:
double &cd=12.3; //错误
然而,一个指向常量的引用就可以:
const double &cd=12.3; //正确
template <typename T>
T add(const T &a,const T &b)
{
return a+b;
}
//…
const std::string &greeting=add(std::string(“hello”),
std::string(“,world”)); //正确
当一个指向常量的引用采用一个字面值来初始化时,该引用实际上被设置为指向采用该字面值初始化的一个临时位置。因此,cd并非真的指向字面值12.3,而是指向一个采用12.3初始化的类型为double的临时变量。
greeting引用则指向对add的调用所返回的无名临时string值。一般来说,这类临时对象在创建它们的表达式的末尾被销毁(离开作用域并且析构函数被调用)。然而,当这类临时对象用于初始化一个指向常量的引用时,在引用指向他们的期间,这些临时对象会一直存在。