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

Is a function call returning a pointer to an object a prvalue?

本文关键字:是否 prvalue 函数调用 指针 对象 返回      更新时间:2023-10-16

让我们想象这个函数:

C* get(C* c, int offset) {
return c + offset;
}

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

C array_c[3];
C* c2 = get(array_c, 2);

get(array_c, 2)是价值吗?

根据 cpp首选项上的"值类别"页面:

  • glvalue("广义"左值(是一个表达式,其计算确定对象、位字段或函数的身份;
  • 一个 prvalue("纯"右值(是一个表达式,其计算结果为:
    • 计算不与对象关联的值
    • 创建一个临时对象并表示它
  • x值("xpiring">(是一个glvalue,表示其资源可以重用的对象或位域;
  • 左值
  • (历史上之所以这样称呼,是因为左值可能出现在赋值表达式的左侧(是不是 X值的 gl;

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

但是,有两点让我觉得这不是一个正确的值。首先,在cpp首选项的同一页面中:

以下表达式是 prvalue 表达式:

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

在我们的示例中,get函数返回一个非引用,因此,根据此定义,调用应作为 prvalue 进行评估。

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

你觉得怎么样?函数调用是否被评估为左值、prvalue(或其他东西(?

get(array_c, 2)*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)是一个左值表达式。正如您所说,您可以对其执行赋值,有效与否,返回的指针是否有效并不重要。

*p,内置的间接表达式;


PS:赋值可以对类类型的右值执行;这不是确定左值表达式的绝对条件。

get(array_c, 2)*get(array_c, 2)不是同一个表达式;它们不必都属于同一值类别。

get(array_c, 2)是一个价值。

以下表达式是prvalue 表达式

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

*get(array_c, 2)是一个左值。

以下表达式是左值表达式

  • *p,内置的间接表达式;

(来源(