int&&rri=42;int&&rri1=rri;rri是一个左值,rri1不能绑定一个左值。int&&rri1=static_cast(rri);但是为什么static_cast转换后就可以了呢?static_cast转换后的类型不还是int&&的吗?
2 回答
HUH函数
TA贡献1836条经验 获得超4个赞
左值/右值是表达式的值的属性,不是类型的属性,不与类型一一对应。它是由表达式的值的类型,与表达式的形式(得到这个值的过程)共同决定的。//42的类型是int,这是一个int字面量,因而是右值int&&rri=42;inta=42;//a的类型也是int,但它是一个变量,因而是左值int&&rri2=a;//ERROR//a+1的类型还是int,它是+运算符的结果,为右值int&&rri3=a+1;rri本身作为一个表达式,是一个左值。单独由一个变量组成的表达式叫做id-expression(unqualified-id)。unqualified-id为函数、变量、类成员变量结果为左值;其它为右值(比如enumerator)。rri是一个变量,结果为左值。8.1.4.1Unqualifiednames1)......Theexpressionisanlvalueiftheentityisafunction,variable,ordatamemberandaprvalueotherwise;......static_cast(rri)的类型虽然与rri相同,但是它是一个右值。 static_cast(v),仅当T为左值引用或对函数的右值引用时,结果为左值。其余情况均为右值。 8.2.9Staticcast1)Theresultoftheexpressionstatic_cast(v)istheresultofconvertingtheexpressionvtotypeT.IfTisanlvaluereferencetypeoranrvaluereferencetofunctiontype,theresultisanlvalue;ifTisanrvaluereferencetoobjecttype,theresultisanxvalue;otherwise,theresultisaprvalue....... C++标准里对每一种表达式形式,都详细定义结果何时为左值、何时为右值。引用来自C++17draftn4659
Qyouu
TA贡献1786条经验 获得超11个赞
static_cast之所以可以是因为表达式static_cast(rri)的valuecategory是xvalue。相比之下表达式rri是lvalue。这两个表达式的类型相同,均为int。 引用初始化是否合法取决于被初始化的引用类型和用于初始化的表达式的类型以及它的valuecategory。valuecategory是表达式的一个属性(也可以理解成所有表达式都可以按valuecategory归为三类)。使用表达式的类型进行分析时,需要首先去掉它的所有引用,即如果直觉上某表达式的类型是int&&,那么分析时其类型要按int处理。valuecategory一种有五种三种primarycategory:lvalue,prvalue,xvalue两种mixedcategory:glvalue(lvalue,xvalue),rvalue(prvalue,xvalue)只有prvalue或xvalue可以用于初始化右值引用,也就是rvalue。因此要确定一个表达式是否能初始化某个引用,我们需要确定这个表达式属于哪个valuecategory。int&&rri=42;\\表达式42是intrvalue(prvalue),可以初始化右值引用int&&rri1=rri;\\表达式rri是intlvalue,不可以初始化右值引用int&&rri2=static_cast(rri);\\表达式`static_cast (rri)`是intrvalue(xvalue),可以初始化右值引用 PS:更加完整的分析还要考虑到隐式转换,但你给出的例子几乎不涉及隐式转换,这部分就略去了。
添加回答
举报
0/150
提交
取消