让我们想象一下这个函数:
C* get(C* c, int offset) {
return c + offset;
}
我想知道对此函数的调用是否被评估为纯右值:
C array_c[3];
C* c2 = get(array_c, 2);
Is get(array_c, 2)
右值?
根据价值类别cppreference 页面:
- a glvalue(“广义”左值)是一个表达式,其计算确定对象、位域或函数的身份;
- a prvalue (“pure” rvalue) is an expression whose evaluation either :
- an xvalue(“eXpiring”值)是一个泛左值,表示其资源可以重用的对象或位字段;
- an lvalue(历史上之所以这么称呼,是因为左值可能出现在赋值表达式的左侧)是不是 xvalue 的左值;
在我们的示例中,表达式get(array_c, 2)
指向一个已经存在的对象,该对象在调用后不会过期。所以我们可以说它是一个左值。此外,我们可以写*get(array_c, 2) = C{};
为表达式赋值。
然而,有两点让我认为它不是左值。首先,在cppreference的同一页面中:
以下表达式是纯右值表达式:
在我们的示例中,get
函数返回非引用,因此根据此定义,调用应被评估为纯右值。
另外,我想知道是否get(array_c, 2)
确实是一个临时值,使其成为纯右值并且*get(array_c, 2)
是一个左值,因为我们可以给它赋值。
你怎么认为?函数调用是否被评估为左值、纯右值(或其他值)?
get(array_c, 2)
and *get(array_c, 2)
是两个不同的表达式,并且具有不同的值类别。
get
按值本身返回指针,然后get(array_c, 2)
被视为右值(prvalue)表达式。你不能像这样对它执行分配get(array_c, 2) = nullptr;
或从中获取地址,例如&get(array_c, 2)
,就好像get
返回其他类型,例如int
.
另一方面,*get(array_c, 2)
is an 左值表达式。正如您所说,您可以对其进行赋值,无论有效与否,返回的指针有效与否并不重要。
*p
,内置的间接表达;
PS:可以对类类型的右值执行赋值;它不是确定左值表达式与否的绝对条件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)