首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数调用是否返回指向对象的指针是prvalue?

函数调用是否返回指向对象的指针是prvalue?
EN

Stack Overflow用户
提问于 2020-07-02 08:58:53
回答 2查看 220关注 0票数 3

让我们想象一下这个函数:

代码语言:javascript
复制
C* get(C* c, int offset) {
    return c + offset;
}

我想知道对这个函数的调用是否被计算为prvalue:

代码语言:javascript
复制
C array_c[3];
C* c2 = get(array_c, 2);

get(array_c, 2)是一个prvalue吗?

根据价值范畴页面上的偏好:

  • glvalue (“广义”lvalue)是一个表达式,其计算结果决定了对象、位域或函数的身份;
  • prvalue (“纯”rvalue)是一个表达式,其计算值为:。
    • 计算不与对象关联的值。
    • 创建一个临时对象并表示它。

  • xvalue (“eXpiring”值)是一个glvalue,表示可以重用其资源的对象或位字段;
  • lvalue (历史上称为lvalue,因为lvalue可能出现在赋值表达式的左侧)是一个glvalue,而不是xvalue;

在我们的示例中,表达式get(array_c, 2)指向一个已经退出的对象,该对象在调用后不会过期。所以我们可以说这是一种价值。此外,我们还可以编写*get(array_c, 2) = C{};来为表达式赋值。

然而,有两点让我觉得这不是一个价值。首先,在优惠政策的同一页:

以下表达式是prvalue表达式:

  • 函数调用或重载运算符表达式,其返回类型为非引用。

在我们的示例中,get函数返回一个非引用,因此,根据这个定义,调用应该被计算为一个prvalue。

另外,我想知道get(array_c, 2)是否确实是一个临时的,使它成为prvalue,而*get(array_c, 2)是一个lvalue,因为我们可以给它赋值。

你认为如何?函数调用是作为lvalue、prvalue (或其他什么)计算的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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表达式的绝对条件。

票数 6
EN

Stack Overflow用户

发布于 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,内建间接表达;

(来源)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62692691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档