【发布时间】:2020-07-02 08:58:53
【问题描述】:
让我们想象一下这个函数:
C* get(C* c, int offset) {
return c + offset;
}
我想知道对该函数的调用是否被评估为纯右值:
C array_c[3];
C* c2 = get(array_c, 2);
get(array_c, 2) 是纯右值吗?
根据cppreference上的Value categories页面:
- glvalue(“广义”左值)是一个表达式,其评估确定对象、位域或函数的身份;
- a prvalue(“纯”右值)是一个表达式,其求值是:
- 计算与对象无关的值
- 创建一个临时对象并表示它
- 一个xvalue(一个“eXpiring”值)是一个glvalue,它表示一个对象或位域,其资源可以被重用;
- lvalue(所谓的,历史上,因为左值可能出现在赋值表达式的左侧)是不是 xvalue 的左值;
在我们的示例中,表达式get(array_c, 2) 指向一个已经存在的对象,该对象在调用后不会过期。所以我们可以说它是一个左值。此外,我们可以写*get(array_c, 2) = C{};给表达式赋值。
但是,有两点让我认为它不是左值。首先在cppreference的同一个页面:
以下表达式是纯右值表达式:
- 函数调用或重载的运算符表达式,其返回类型为非引用
在我们的示例中,get 函数返回一个非引用,因此根据这个定义,调用应该被评估为纯右值。
另外,我想知道get(array_c, 2) 是否确实是一个临时的,使它成为一个prvalue,而*get(array_c, 2) 是一个左值,因为我们可以为它分配一个值。
你怎么看?函数调用是否被评估为左值、纯右值(或其他)?
【问题讨论】:
标签: c++ language-lawyer value-categories