到底怎么确定函数调用表达式的结果是左值还是右值?

《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;
}

c++

5个回答

左值右值的形式区分(或者称语法区分)是能否用取地址&运算符;语义区分(即其本质涵义)在于表达式代表的是持久对象还是临时对象。

joseph_tyrone
joseph_tyrone 这个倒是一个较好的说法,首先在形式上满足条件,再次看是否是临时对象。这个当初我也是这么想的,只是没有找到确切的说法,也没有更多的佐证。
大约 2 年之前 回复

&是取地址符,&rs得到的是一个地址值,相当于是一个常量了所以不能被赋值,而ps是一个指针变量,用来存放地址值。

weixin_40284000
钢化玻璃心 回复joseph_tyrone: 没见过这个定义方法,一般都是String rs或者String *rs,String &这种定义第一次见,但不管怎么说&在c中就是一个取地址符,所以你的表达式c我的理解就是String rs,&rs最终得到的是你定义的String型变量rs的地址
大约 2 年之前 回复
joseph_tyrone
joseph_tyrone 这里&rs是定义rs,rs是string&类型,string &rs = shortStr(str1,str2)是给临时对象定义一个别名,也就是让rs引用临时对象,不是你说的是取地址运算。你可能没看清楚吧!
大约 2 年之前 回复

左值就是变量,可被修改,右值可以是变量和常量

suyinfan
suyinfan 回复joseph_tyrone:不好意思, 我孤陋寡闻了
大约 2 年之前 回复
suyinfan
suyinfan 回复joseph_tyrone: 左值不能被修改,哪里看到的,我做了这么多年的C++开发,头一次看到这样的说法
大约 2 年之前 回复
suyinfan
suyinfan 回复joseph_tyrone: 。。。,你说的不是赋值,是初始化
大约 2 年之前 回复
joseph_tyrone
joseph_tyrone 左值也可以是不可修改的,如const常量。
大约 2 年之前 回复

我用的是VS2017,以上代码均验证过,只有表达式C无法通过。

左值一般是可以对其进行引用的,也就是&+左值。右值不可以,像常量一般被用作右值

u014735496
小超人_xx 回复joseph_tyrone: 我这里说的常量就是指字面常量。
大约 2 年之前 回复
joseph_tyrone
joseph_tyrone 回复weixin_42625825: 是的,这里表达式C的&是引用,应该如zhenjun_ma所说的一样,一个对象在形式上满足可以被赋值和使用取地址操作的基础上,还应该区分是否是临时对象。
大约 2 年之前 回复
weixin_42625825
Orange236 回复joseph_tyrone: &可以作为引用运算符,也可以作为地址操作符,这里&作为引用运算符,引用运算符是对一个已经存在的变量进行命名,而指针针对地址,可以指向没有变量名的地址。
大约 2 年之前 回复
joseph_tyrone
joseph_tyrone 你说的“&+左值”是取地址吧,本例也可以。另外常量有分两种,一种是const类型的常量,本质还是对象,只是不能修改,也是左值。另一种是像字面值常量或常量表达式类型的常量,这些只能是右值。
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐