在C ++中使用std :: move()和xvalue

std::move() and xvalue in C++

本问题已经有最佳答案,请猛点这里访问。

有人能给我一个关于xValue和std::move()行为的"非循环"定义/解释吗?

我查看了cppreference页面,它说"std::move()生成一个xvalue"。(好)

然后我查找了"xvalue"的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,如"std:move"。???)


那句话没有循环定义。

The following expressions are xvalue expressions:

a function call or an overloaded operator expression, whose return type is rvalue reference to object, such as std::move(x);

...

这里std::move只是一个例子,其本质是"其返回类型是右值引用"。由于返回右值引用的函数并不常见,而std::move的目标是这样做,因此它是一个很好的例子。这是std::move的签名:

1
2
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

其返回值必须是右值引用。


std::move()将表达式从左值或右值转换为Xvalue。

左值是一个对象在内存中占据某个位置,而右值则暂时占用内存。

1
2
3
4
int main() {  
   int x = 3 + 4;  
   std::cout << x << std::endl;
}

在上面的示例中,x是左值,3 + 4是右值。现在看,x不是临时值,而3 + 4表达式是临时值。

现在考虑你这样做:int y = x;。你的记忆里有两份x的拷贝,对吗?

请检查以下示例:

1
2
3
4
5
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()检查以下示例:

1
2
3
4
5
swap(int &a, int &b) {
    int tmp = std::move(a); // tmp is an xvalue
    a = std::move(b);  
    b = std::move(tmp);
}

你不抄袭,而是把它们移到别处。实际上,你要传输它的内容一段时间。它们很快就会被摧毁。他们现在是xvalues:。