让我们想象一下这个函数:
C* get(C* c, int offset) {
return c + offset;
}我想知道对这个函数的调用是否被计算为prvalue:
C array_c[3];
C* c2 = get(array_c, 2);get(array_c, 2)是一个prvalue吗?
根据价值范畴页面上的偏好:
在我们的示例中,表达式get(array_c, 2)指向一个已经退出的对象,该对象在调用后不会过期。所以我们可以说这是一种价值。此外,我们还可以编写*get(array_c, 2) = C{};来为表达式赋值。
然而,有两点让我觉得这不是一个价值。首先,在优惠政策的同一页:
以下表达式是prvalue表达式:
在我们的示例中,get函数返回一个非引用,因此,根据这个定义,调用应该被计算为一个prvalue。
另外,我想知道get(array_c, 2)是否确实是一个临时的,使它成为prvalue,而*get(array_c, 2)是一个lvalue,因为我们可以给它赋值。
你认为如何?函数调用是作为lvalue、prvalue (或其他什么)计算的吗?
发布于 2020-07-02 09:03:58
get(array_c, 2)和*get(array_c, 2)是两个不同的表达式,具有不同的值类别。
get通过值本身返回指针,然后get(array_c, 2)被视为rvalue (prvalue)表达式。您不能像get(array_c, 2) = nullptr;那样在它上执行赋值,也不能像&get(array_c, 2)一样从它获得地址,就像get返回其他类型的int一样。
另一方面,*get(array_c, 2)是lvalue表达式。正如您所说的,您可以在其上执行赋值,这是否有效,返回的指针是否有效并不重要。
*p,内建的间接表达式;
PS:赋值可以对类类型的lvalue执行;它不是确定lvalue表达式的绝对条件。
发布于 2020-07-02 09:03:11
get(array_c, 2)和*get(array_c, 2)不是同一个表达式;它们不一定都在相同的值类别中。
get(array_c, 2)是一个prvalue。
以下表达式是prvalue表达式: ..。
*get(array_c, 2)是一个值。
以下表达式为lvalue表达式: ..。
*p,内建间接表达;(来源)
https://stackoverflow.com/questions/62692691
复制相似问题