【发布时间】:2015-02-17 22:16:39
【问题描述】:
我对下面的代码感到困惑:
#include <iostream>
int main()
{
int x{};
int&& rvx = static_cast<int&&>(x);
++rvx;
std::cout << x << std::endl;
}
它的输出是1。我不明白这是如何工作的。 static_cast 应该将左值 x 转换为 xvalue,然后将其分配给 rvx。为什么递增rvx 会导致x 发生变化?这是因为转换后的左值到右值本质上位于相同的内存位置,但现在它只是被认为是右值?我的印象是(这可能是错误的)演员不知何故从它的论点中创造了一个临时的。
【问题讨论】:
-
我认为您对 lvalue 和 rvalue 的含义感到困惑。这些是描述表达的形容词。它们不是各种对象。
-
整数没有内部状态,除了它的值(没有什么可移动的)。
-
@MattMcNabb 我的措辞有点草率,我知道对象总是左值(正如它们所命名的那样),但正如我所说的那样,给人的印象是 static_cast 会复制。跨度>
-
不,对象不是左值。它们是物体。左值是表达式的一个类别。
-
@vsoftco 对象是内存区域。还有一些关于对象类型的信息,但重要的部分是内存区域。没有关于如何访问该内存的概念。它可以通过一个变量,也可以通过任何其他表达式。成功调用
malloc()的结果指向一个对象或一系列对象,即使没有引用这些对象的变量。
标签: c++ c++11 rvalue-reference lvalue-to-rvalue