返回指向对象的指针的函数调用是否为 prvalue?
Is a function call returning a pointer to an object a prvalue?
让我们想象这个函数:
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
,内置的间接表达式;
(来源(
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 返回指向对象的指针的函数调用是否为 prvalue?
- 一元*运算符的操作数是否期望一个 prvalue
- 我们如何测试是否可以使用 prvalue 调用某种类型的表达式
- 将非类非数组 prvalue 转换为符合 cv 条件的类型是否合法?
- 折叠表达式的值类别是否始终是 prvalue?
- 是否有任何用例 std::forward 带有 prvalue