一.返回左值
•值形式的函数返回值通常都具有右值属性,即在函数的调用者空间根据函数的返回类型创建一个匿名对象,负责接收该函数的返回值
•用于接收函数返回值的匿名对象和表达式的值类似,通常只具有语句级生命期且只读,即所谓将亡右值
•如果函数返回的是一个引用,那么用于接收该返回值的就不再是一个匿名的将亡右值对象,而是一个引用该函数所返回引用的目标对象的引用,甚至可以是左值引用
•函数返回的左值引用可与其它任何形式的左值一样,参与包括赋值、复合赋值、自增减等在内的各种左值运算
二.不能返回局部变量的引用
•函数的局部变量只具有函数级甚至块或语句级的生命周期,函数一旦返回,所有的局部变量即刻销毁,即使通过返回值获得了对它们的引用,其目标也将是未定义的
–int& foo (void)
{
int n = 123;
return n;
} // 危险
int* bar (void)
{
int n = 456;
return &n;
} // 危险
int hum (void)
{
int n = 789;
return n;
}
–int& foo (int& n)
{
return n;
}
int& bar (int* n)
{
return *n;
}
int& hum (int n)
{
return n;
} // 危险
–int* foo (int& n)
{
return &n;
}
int* bar (int* n)
{
return n;
}
int* hum (int n)
{
return &n;
} // 危险