《C++primer》(第五版)P129页中说道:赋值运算符的左侧运输对象必须是一个可修改的左值。_
还有很多人说:左值右值的判定是:看能否使用取地址运算符,能用的是左值。
P202说到:函数的返回类型决定函数调用是否是左值。调用一个返回引用的的函数得到左值,其他返回类型得到右值。
请看看下面的代码,为什么该函数调用可以被用在赋值符左侧,也可以使用取地址运算符?但是最后一个表达式却是错的,说是:非常量引用只能绑定到左值。
到底怎么确定函数调用表达式的结果是左值还是右值?
string shortStr(string s1, string s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
int main( )
{
string str1 = "abcd", str2 = "efghi";
shortStr(str1, str2) = "oooo"; //A
string *ps=&(shortStr(str1, str2)); //B
string &rs = shortStr(str1,str2); //C
system("pause");
return 0;
}
到底怎么确定函数调用表达式的结果是左值还是右值?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
6条回答
- zhenjun_ma 2018-07-06 08:02关注
左值右值的形式区分(或者称语法区分)是能否用取地址&运算符;语义区分(即其本质涵义)在于表达式代表的是持久对象还是临时对象。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥50 汇编语言除法溢出问题
- ¥65 C++实现删除N个数据列表共有的元素
- ¥15 Visual Studio问题
- ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
- ¥20 求一个html代码,有偿
- ¥100 关于使用MATLAB中copularnd函数的问题
- ¥20 在虚拟机的pycharm上
- ¥15 jupyterthemes 设置完毕后没有效果
- ¥15 matlab图像高斯低通滤波
- ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗