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

时间:2018-01-29 18:20:37

标签: c++ xvalue stdmove

有人能给我一个xvalue和std :: move()行为的“非循环”定义/解释吗?

我查看了cppreference页面,它说“std :: move()产生一个xvalue”。 (OK)

然后我查找了“xvalue”的定义,它首先说的是它是一个函数调用或重载的运算符表达式,例如“std:move”。 (???)

2 个答案:

答案 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:)