有人能给我一个关于xvalue和std::move()行为的“非循环”定义/解释吗?
我查看了cp首选项页面,页面上写着"std::move()生成xvalue“。(好)
然后我查找了“xvalue”的定义,它说的第一件事是它是一个函数调用或重载操作符表达式,例如"std:move“。(??)
发布于 2018-01-29 18:43:44
std::move()将表达式从lvalue或rvalue转换为xvalue。
lvalue是指一个对象占用内存中的某个位置,而rvalue则暂时占用内存。
int main() {
int x = 3 + 4;
std::cout << x << std::endl;
}在上面的示例中,x是一个lvalue,而3 + 4是一个rvalue。现在,可以看到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);
}你不抄袭,而是把它们移到某个地方。实际上,你把它的内容转移了一段时间。他们很快就会被摧毁。它们现在是xvalues :)
发布于 2018-01-29 18:27:59
在那句话中没有循环定义。
以下表达式为xvalue表达式: 函数调用或重载操作符表达式,其返回类型为对对象的rvalue引用,如std::move(x); ..。
这里std::move只是的一个例子,本质是“其返回类型是rvalue引用”。由于返回rvalue引用的函数并不常见,而std::move则是这样做的,因此它提供了一个很好的示例。这是std::move的签名
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;其返回值必须是rvalue引用。
https://stackoverflow.com/questions/48507641
复制相似问题