有人能给我一个xvalue和std :: move()行为的“非循环”定义/解释吗?
我查看了cppreference页面,它说“std :: move()产生一个xvalue”。 (OK)
然后我查找了“xvalue”的定义,它首先说的是它是一个函数调用或重载的运算符表达式,例如“std:move”。 (???)
答案 0 :(得分:1)
that sentence中没有循环定义。
以下表达式是xvalue表达式:
函数调用或重载的运算符表达式,其返回类型是对象的右值引用,例如std :: move(x);
...
这里std::move
仅仅一个例子,本质是"其返回类型是右值引用"。由于返回右值参考的函数不是很常见,而std::move
旨在这样做,因此它就是一个很好的例子。这是std::move
:
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
,其返回值必须是右值参考。
答案 1 :(得分:0)
std::move()
将表达式从左值或右值转换为 xvalue 。
左值是一个对象占据内存中的某个位置,而 rvalue 暂时占用内存。
int main() {
int x = 3 + 4;
std::cout << x << std::endl;
}
在上面的示例中,x
是左值,3 + 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
s:)