对于这个问题的广泛性,我很抱歉,只是所有这些细节都是紧密相连的..
我一直试图了解具体两个值类别之间的区别 - xvalues 和 prvalues,但我仍然感到困惑。
无论如何,我试图为自己开发的“身份”概念的心智模型是,应该保证拥有它的表达式驻留在实际程序的数据存储器中。
由于这个原因,字符串文字是左值,它们保证在整个程序运行期间驻留在内存中,而数字文字是纯右值,例如可以假设存储在直接 asm 中。
这似乎同样适用std::move
于纯右值文字,即在调用时fun(1)
我们只会在被调用者框架中获得参数 lvalue,但在调用fun(std::move(1))
xvalue 时,glvalue 的“种类”必须保留在调用者框架中。
然而,这种心智模型至少不适用于临时对象,据我所知,它们应该始终在实际内存中创建(例如,如果像fun(MyClass())
使用 prvalue 参数一样调用 rvalue-ref-taking 函数)。所以我猜这个心智模型是错误的。
那么思考xvalues的“身份”属性的正确方法是什么?我已经读过,通过身份我可以比较地址,但是如果我可以比较 2 MyClass().member
s 的地址(根据 cppreference 的 xvalue),假设通过 rvalue refs 将它们传递给某个比较函数,那么我不明白为什么我可以'对 2 MyClass()
s (prvalue) 做同样的事情?
与此相关的另一个来源是这里的答案: 什么是移动语义?
请注意,即使 std::move(a) 是一个右值,它的求值也不会创建一个临时对象。这个难题迫使委员会引入第三个价值类别。可以绑定到右值引用的东西,即使它不是传统意义上的右值,也称为 xvalue(eXpiring 值)。
但这似乎与“可以比较地址”无关,并且a)我看不出这与右值的“传统意义”有何不同;b)我不明白为什么这样的原因需要语言中的新值类别(好吧,这允许为 OO 意义上的对象提供动态类型,但 xvalues 不仅仅指对象)。