【问题标题】:Is a temporary struct an r-value or an x-value?临时结构是 r 值还是 x 值?
【发布时间】:2021-02-04 14:31:21
【问题描述】:

我想了解有关 C++ 值类别的说明。

struct Foo {...};
void do_something(Foo{});

上面的 Foo{} 是 r 值还是 x 值?

我了解值类别存在层次结构,并且 r 值实际上是 x 值或 pr 值。我也知道标准说“临时实现是一个 x 值”,但我不确定创建一个临时对象是否符合这个定义。

但我不确定的是 gl-value 和 r-value 是否是层次结构中的“抽象”类别,而叶子(l-value、x-value 和 pr-value)是实际的实现.

谁能帮我解释一下?

【问题讨论】:

标签: c++ types c++17 rvalue


【解决方案1】:

来自https://eel.is/c++draft/basic.lval(2021 年 4 月 2 日访问):

每个表达式都属于一个基本的 此分类法中的分类:lvalue、xvalue 或 prvalue。这 表达式的属性称为其值类别。

这回答了您关于 gl-value 和 r-value 是否是值的类别的问题:它们是。

关于你的具体情况是什么值,让我们看看xvalue:

  • xvalue 是一个泛左值,表示其资源可以重复使用的对象(通常是因为它接近其生命周期的终点)。

[...剪辑...]

# [注3:一个表达式是一个xvalue,如果它是:

  • (4.1) 调用函数的结果,无论是隐式还是显式,其返回 type 是对对象类型 ([expr.call]) 的右值引用,
  • (4.2) 转换为对对象类型的右值引用 ([expr.type.conv], [expr.dynamic.cast], [expr.static.cast] [expr.reinterpret.cast], [expr.const.cast], [expr.cast]),
  • (4.3) 下标操作 一个 xvalue 数组操作数 ([expr.sub]),
  • (4.4) 类成员访问 指定非引用类型的非静态数据成员的表达式 其中对象表达式是一个 xvalue ([expr.ref]),或
  • (4.5) 一个 .* 指向成员的表达式,其中第一个操作数是 xvalue 和第二个操作数是指向数据成员的指针 ([expr.mptr.oper])。

您的情况似乎不适合其中任何一个。现在让我们看看prvalue:

  • prvalue 是一个表达式,它的求值初始化一个对象或计算一个运算符的操作数的值,由它出现的上下文指定,或者是一个类型为 cv void 的表达式。

您的案例似乎正在初始化一个对象。出于这个原因,我会说这是一个prvalue。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2017-06-10
    • 2017-06-11
    • 2022-08-05
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多