【问题标题】:What is difference between std::move and pass by reference in C++? [duplicate]std::move 和 C++ 中的引用传递有什么区别? [复制]
【发布时间】:2019-09-26 03:13:48
【问题描述】:

我觉得通过引用和移动具有相同的结果。在下面的示例中,移动语义和通过引用传递具有相同的结果。我假设当我们使用移动语义时,所有权被传递给函数,并且主要变量不包含任何值。

#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;
}

谁能告诉我我的困惑。我对 move 的理解哪里出了问题?

【问题讨论】:

  • 移动对原始类型没有任何作用。使用具有明确定义的 move-from 状态的类尝试您的测试,例如 std::unique_ptr

标签: c++ c++11 move


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    引用创建传递的变量的别名。移动是不同的东西。移动“窃取”变量持有的值。 例如,如果您有

      void foo(void)
      {
         std::shared_ptr<int> p = std::make_shared<int>();
        std::shared_ptr<int> ps = std::move(p);//after execution p has expired
        std::cout << "count:" << ps.use_count() << std::endl;
        std::cout << "count:" << p.use_count() << std::endl;
        std::shared_ptr<int> ps2 = ps;// simple copy,after executuion the reference count 
                                     // is 2 
        std::cout << "count:" << ps2.use_count() << std::endl;
      }
    

    当这个例程将被执行时, ps 共享指针将窃取 p 的值并且 p 将被传出。 但是当 ps2 被定义时, ps 的内容将被复制到这里并且引用计数会增加。新值将是 2。

    【讨论】:

    • std::move 不会窃取任何东西。它甚至不动。它只是给你一个右值。传统的移动 ctors/assignment ops 可能会偷东西。
    • @LightnessRacesinOrbit 可以将其视为给予“偷窃许可”。收件人不需要偷窃,但他们有权这样做。 (正如您所指出的,它正式将对象转换为右值,但在这种情况下,右值的主要特点是它们是临时的,因此可以窃取。)
    • @RaymondChen 没错。
    • @RaymondChen 正是你详细描述的,我的意思是“偷”这个词
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2020-03-09
    • 2012-05-22
    • 2012-11-19
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多