有人可以给我 xvalue 和 std::move() 行为的“非循环”定义/解释吗?
我查看了 cppreference 页面,它说“std::move() 产生一个 xvalue”。(好的)
然后我寻找“xvalue”的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,例如“std:move”。(???)
std::move()
将表达式从左值或右值转换为xvalue。
左值是一个对象占用内存中的某个位置,而右值是临时占用内存。
int main() {
int x = 3 + 4;
std::cout << x << std::endl;
}
在上面的示例中, thex
是一个左值,而 the3 + 4
是一个右值。现在看到x
不是临时的,而3 + 4
表达式是临时值。
现在考虑你这样做int y = x;
:x
你在内存中有两个副本,对吧?
检查以下示例:
swap(int &a, int &b) {
int tmp = a; // Two copies of a; one of them is tmp
a = b; // Two copies of b; one of them is a
b = tmp; // Two copies of tmp; one of them is b
}
使用以下示例检查std::move()
:
swap(int &a, int &b) {
int tmp = std::move(a); // tmp is an xvalue
a = std::move(b);
b = std::move(tmp);
}
你不抄袭;你把它们移到某个地方。实际上,您将其内容传输了一段时间。他们很快就会被摧毁。他们现在xvalue
是 :)
那句话中没有循环定义。
以下表达式是 xvalue 表达式:
函数调用或重载的运算符表达式,其返回类型是对对象的右值引用,例如 std::move(x);
...
这里std::move
只是一个例子,本质是“其返回类型是右值引用” 。由于返回右值引用的函数不是很常见,而std::move
旨在这样做,因此它是一个很好的例子。这是 的签名std::move
:
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
其返回值必须是右值引用。