std :: move()和xvalue在C ++中
这个问题在这里已经有了答案:
该句子中没有循环定义。
以下表达式是xvalue表达式:
函数调用或重载运算符表达式,其返回类型是右值引用对象,如std :: move(x);
...
这里std::move
仅仅是一个例子,其实质是“谁的返回类型是右值引用”。 由于返回右值引用的函数不是很常见,而std::move
的目的是这样做,因此它是一个很好的例子。 这是std::move
的签名:
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
其返回值必须是右值引用。
std::move()
将表达式从左值或右值转换为xvalue。
左值是一个对象占用内存中的某个位置,而右值占用内存。
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 :)
上一篇: std::move() and xvalue in C++
下一篇: What is an lvalue?