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

这个问题在这里已经有了答案:

  • 什么是右值,左值,xvalues,glvalues和prvalues? 11个答案

  • 该句子中没有循环定义。

    以下表达式是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 :)

    链接地址: http://www.djcxy.com/p/73003.html

    上一篇: std::move() and xvalue in C++

    下一篇: What is an lvalue?