在C ++中std :: move和按引用传递之间有什么区别?

时间:2019-05-08 11:33:36

标签: c++ c++11 move

我觉得通过引用和举动具有相同的结果。在下面的示例中,移动语义和通过引用传递都具有相同的结果。我以为当我们使用移动语义时,所有权是通过函数传递的,而在主变量中,变量没有任何值。

#include <iostream>

using namespace std;
void move_function(int&& a)
{
    cout<<"a:"<<a<<endl;
    a++;
    cout<<"a:"<<a<<endl;
}

void function(int& val)
{
    val++;
    cout<<"val:"<<val<<endl;;
}

int main()
{
    int a = 100;
    move_function(move(a));
    cout<<"main a:"<<a<<endl;
    function(a);
    cout<<"main a:"<<a<<endl;

    return 0;
}

有人能告诉我我的困惑吗?我对移动的理解哪里出错了?

2 个答案:

答案 0 :(得分:1)

Move()赋予新对象所有权。在希望将互斥量的所有权传递给锁的多线程中,这很有用。

按引用传递是通过创建别名在函数之间传递对象的一种方式。

答案 1 :(得分:0)

参考创建所传递变量的别名。移动是不同的。移动“窃取”变量持有的值。 例如,如果您有

<script>
    function printDiv() {
        var divToPrint = document.getElementById("monthly-report");
        newWin = window.open("");
        newWin.document.write(divToPrint.outerHTML);
        newWin.print();
        newWin.close();
    }

</script>

当执行此例程时,ps共享指针将窃取p的值,并产生p值。 但是,当定义了ps2时,将ps的内容复制到此内容,并增加引用计数。新值将为2。