- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于这个问题的广泛性,我很抱歉,只是所有这些细节都是紧密相关的..
我一直在努力理解具体两个值类别(xvalues 和 prvalues)之间的区别,但我仍然感到困惑。
无论如何,我试图为自己建立的关于“身份”概念的心智模型是,应该保证拥有它的表达式驻留在实际程序的数据内存中。
正因如此,字符串字面量是左值,它们保证在整个程序运行期间驻留在内存中,而数字字面量是纯右值,例如假设存储在直接 asm 中。
这似乎也适用于纯右值文字中的 std::move
,即当调用 fun(1)
时,我们只会获得被调用方帧中的参数左值,但是当调用 fun(std::move(1))
时,glvalue 的 xvalue 'kind' 必须保存在调用者框架中。
然而,这种心智模型至少不适用于临时对象,据我所知,临时对象应该始终在实际内存中创建(例如,如果一个右值引用函数被称为 fun(MyClass ())
带有纯右值参数)。所以我猜这个心智模型是错误的。
那么思考 xvalues 的“身份”属性的正确方法是什么?我已经读过,通过身份我可以比较地址,但是如果我可以比较 2 个 MyClass().member
的地址(根据 cppreference 的 xvalue),假设通过右值引用将它们传递给一些比较函数,那么我不明白为什么我不能用 2 个 MyClass()
s (prvalue) 做同样的事情?
与此相关的另一个来源是此处的答案: What are move semantics?
Note that even though std::move(a) is an rvalue, its evaluation does not create a temporary object. This conundrum forced the committee to introduce a third value category. Something that can be bound to an rvalue reference, even though it is not an rvalue in the traditional sense, is called an xvalue (eXpiring value).
但这似乎与“可以比较地址”无关,并且 a) 我看不出这与右值的“传统意义”有何不同; b) 我不明白为什么这样的原因需要语言中的新值类别(好吧,好吧,这允许为 OO 意义上的对象提供动态类型,但 xvalues 不仅仅指对象)。
最佳答案
我个人有另一种心智模型,它不直接处理身份和内存等等。
prvalue
来自“pure rvalue”,而 xvalue
来自“expiring value”,这是我在心智模型中使用的信息:
纯右值指的是“纯粹意义上”的临时对象:编译器可以绝对确定地判断其求值是一个具有以下临时性的对象的表达式刚刚创建并且即将过期(除非我们通过引用绑定(bind)进行干预以延长其生命周期)。该对象是在表达式求值期间创建的,它将根据“母表达式”的规则消亡。
相比之下,过期值 是一个表达式,其计算结果为对 promise 即将过期的对象的引用。那就是它给了你一个 promise ,你可以对这个对象做任何你想做的事,因为无论如何它接下来都会被销毁。但是你不知道这个对象是什么时候创建的,或者它应该在什么时候被销毁。你只知道你“拦截”了它,因为它快要死了。
实践中:
struct X;
auto foo() -> X;
X x = foo();
^~~~~
在此示例中,计算 foo()
将产生一个 prvalue
。只要查看这个表达式,您就会知道这个对象是作为 foo
返回的一部分创建的,并将在这个完整表达式的末尾被销毁。因为您知道所有这些事情,所以您可以开启它的生命周期:
const X& rx = foo();
现在 foo 返回的对象的生命周期延长到 rx
auto bar() -> X&&
X x = bar();
^~~~
在此示例中,计算 bar()
将产生一个 xvalue
。 bar
向您保证 给您一个即将过期的对象,但您不知道这个对象是什么时候创建的。它可以在调用 bar
之前创建(无论是否是临时的),然后 bar
为您提供对它的 rvalue reference
。优点是你知道你可以用它做任何你想做的事,因为它不会在后记中使用(例如,你可以从它移动)。但是你不知道这个对象什么时候应该被销毁。因此你不能延长它的生命周期——因为你一开始就不知道它原来的生命周期是多少:
const X& rx = bar();
这不会延长生命周期。
关于c++ - xvalues 与 prvalues : what does identity property add,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45317763/
您好,下面是我在 AWS 中创建启用了弹性 IP 的实例的模板。但是我不确定我哪里出错了。我已经通过在线 json 验证器验证了 json,仍然面临问题请帮忙 { "AWSTemplateForm
标题有点乱,但已经说明了一切。我想在一个属性的属性上有一个属性观察器: class A { var b: B init() { b = B() } fu
假设我的一个 Controller 中有这样的方法: [Route("api/Products")] public IQueryable GetProducts() { return db.P
这有效: // @flow import React, {Component} from 'react'; type Props = {}; class Delete extends Componen
我有一个 ViewModelBase 类,我在其中为 INotifyPropertyChanged 接口(interface)定义了 RaisePropertyChanged 方法。大多数 MVVM
我创建了类: class StorageBase { public Queue Slices {get;set;} } 和 wpf 自定义控件,它具有 StorageBase 类型的依赖属性
我的 java 应用程序问题是 log4j2 系统日志不是写在 'local1.log' 中而是'消息'。我的/etc/rsyslog.conf 在/etc/rsyslog.conf 中配置为 'lo
为什么需要在对象中使用 this.property = property ?它是用来定义对象的“外部世界”的属性吗? function Person(property) { this.property
摘要: 这个问题是关于属性的继承与从彼此继承属性的类的内部和外部的不同读/写访问相结合。 详细信息: 我有一个类 A 和另一个继承自 A 的类 B。 A 中声明了属性someProperty。我希望该
我正在开发 ASP.NET MVC 应用,设计域模型,使用(测试)新的 EF Code First 功能。 我有一个可能有也可能没有截止日期的事件实体,处理它的最佳方法是什么? 1 个属性: publ
我在配置项目时经常使用它们,但大多数情况下都是按照指示添加 fragment 。我完全不知道哪个文件到底是做什么的。谁能清楚地说明每个文件的用途。 到目前为止我认为 local.properties
在运行 python 文件以使用 rasa nlu 训练文件时,我在命令提示符下收到此错误 我目前正在使用 Windows 10 rasa_core==0.8.2 rasa_nlu==0.11.4 p
我在这方面遇到了一些麻烦,尽管我已经搜索了答案,但还是找不到。 为了使用 AsyncAppender,我看到了很多不同的 log4j 配置,无论如何,它们都与 .properties 配置文件无关。
我正在编写一个 Python 类,并使用 @property 装饰器为该类创建属性。 我在文档中没有找到太多关于这个装饰器的信息,但是从我可以从 Stack Overflow 和我的 Python l
在 gradle 任务中,我可以创建这样的路径: System.env.FOLDER_PATH + '/subFolder' 但我想在我的 gradle.properties 中设置它,所以它会像 s
如何在属性文件的 log4j2 中创建键值对? 我知道在 log4j 版本 1 中它是这样完成的: log4j.appender.x.additionalFields={'key': 'value'}
我想通了 struct PropertyTest { @property int x() { return val; } @property void x( int newVal )
我有 REST (Jersey) webservice,它利用了一些编码/解码到/来自 XML 的数据对象。数据对象位于 webservice war 所依赖的单独项目/jar 中。 我使用 MOXy
我正在创建一个 LinkedList 类: function LinkedList(){ ... 有什么区别: this.addNode = function(data){
关于语义的快速问题:) 如果我正在编写一个协议(protocol),这是首选: // (a) @protocol MyProtocol @property (nonatomic, copy) NSSe
我是一名优秀的程序员,十分优秀!