C++表达式要么是左值,要不然就是右值,左值可以位于赋值语句的左侧,右值则不能。
当一个对象被用做右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)
引用返回左值
函数的返回类型决定函数调用是否是左值,调用一个返回引用的函数得到左值,其他返回类型得到右值。特别是,我们能为返回类型是非常量引用的函数的结果赋值:
char &get_val(string &str,string::size_type ix)
{
return str[ix];
}
int main()
{
string s("a value");
cout<<s<<endl;
get_val(s,0)='A';//引用函数作为左值,将s[0]的值改为A
cout<<s<<endl;
return 0;
}
如果返回类型是常量引用,我们不能给调用的结果赋值,这一点和我们熟悉的情况一样
shorterString("hi","bye")="x";//错误,返回值是一个常量
返回数组指针或引用
因为数组不能被拷贝,所以函数不能返回数组,不过函数可以返回数组的指针或引用,虽然较为繁琐。有三种简便办法:
//返回数组的引用,且该数组是包含10个string对象的数组
//使用类型别名
using ArrT = string[10];
ArrT& func1(ArrT& arr);
//使用尾置返回类型
auto func2(ArrT& arr) -> string(&)[10];
//使用类型识别符decltype
string arrS[10];
decltype(arrS)& func3(ArrT& arr);
列表初始化返回值
C++11新标准规定,函数可以返回花括号内包围的值的列表。如果列表为空,临时量执行值初始化;否则,返回的值由函数的返回类型决定。
vector<string>process()
{
//...
// expected 和 actual 是string对象
if(expected.empty())
return{};//返回一个空vector对象
else if(expected==actual)
return {"fuctionX","okay"};
else
return {"functionX",expected,actual};
}