首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xvalue/prvalue类别真的重要吗?

xvalue/prvalue类别真的重要吗?
EN

Stack Overflow用户
提问于 2015-02-21 01:59:39
回答 1查看 472关注 0票数 0

创建xvalue的唯一方法是使用static_cast< T&>转换。是的,按标准还有另外三种情况,但它们都需要另一个xvalue。因此,为了简单起见,我认为这是目前唯一的方法。

我们需要把东西传给static_cast。我们叫它吉兹莫吧。无论gizmo到底是什么(lvalue或rvalue),static_cast的结果都是对完全相同的事物的rvalue引用(我的意思是它不会产生任何临时对象)。结果的值类别将是prvalue或xvalue (用于对象)。让我们考虑第二种情况。

我知道,对于对象,xvalue比prvalue要好得多,因为它具有动态类型;但奇怪的是,我不知道gizmo的任何操作,它的生成prvalue包含对同一事物的引用:它看起来像所有将gizmo转换为prvalue的操作(比如static_cast< T>或传递到具有非引用结果的函数)将创建临时对象(使用调用复制构造函数等等)。

总之,如果我们有对象类型的值,我们可以:

  1. 根据该值生成xvalue

  1. 根据临时对象(可能是值的副本)生成prvalue *

也许真正重要的是rvalue引用实际上指的是(相同的东西或副本)而不是xvalue/prvalue类别?如果是这样的话,我们可能会认为static_cast< T&>只是保存对相同事物的引用而不再关心xvalue/prvalue的唯一方法。不是吗?

  • 当然,如果值已经是prvalue,我们不必做一些事情来获得prvalue,但是在这种情况下,动态类型不能丢失。因此,再次与xvalue没有区别。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-19 16:51:16

例如,xvalueprvalue在使用decltype扣减规则时很重要。优先选择说的话:

  • a)如果表达式的值类别为xvalue,则decltype生成T&&
  • b)如果表达式的值范畴为lvalue,则decltype生成T&
  • c)如果表达式的值类别为prvalue,则decltype生成T

通过这种方式,编译器可以更好地提示将出现什么样的表达式。当然,这在处理表达式的语义意义上是很重要的。

示例:

代码语言:javascript
复制
struct A {};
int main() {
    decltype(auto) a1 = A(); //prvalue, type of a1 is A
    decltype(auto) a2 = std::move(A()); //xvalue, type of a2 is A&&
}

在本例中使用autoa1a2都将获得A类型。

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

https://stackoverflow.com/questions/28641199

复制
相关文章

相似问题

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