右值引用和move语义

  1. #include
    #include
    #include
    using namespace std;
    string getMove()
    {
    string a = “123456”;
    return move(a);
    }
    void display(int &i)
    {
    cout << "Lvalue process " << i << endl;
    }
    void display(int &&i)
    {
    cout << "Rvalue process " << i<< endl;
    }
    vector double_vector(vector a)
    {
    for (auto &r : a)
    {
    r *= 2;
    }
    return std::move(a);
    }
    class MoveTest
    {
    public:
    MoveTest()
    {
    cout << “create” << endl;
    }
    MoveTest(MoveTest &)
    {
    cout << “copy” << endl;
    }
    MoveTest(MoveTest &&)
    {
    cout << “move” << endl;
    }
    };
    MoveTest testCopy(MoveTest m)
    {
    return m;
    }
    MoveTest testMove(MoveTest m)
    {
    return std::move(m);
    }
    int main()
    {
    string b = getMove();
    cout << b << endl;
    cout << “-----------------” << endl;
    int &&a = 10;
    //display(a);
    display(a);
    display(12);
    cout << “-----------------” << endl;
    string str = “123456”;
    string str1 = std::move(str);
    cout << str1 << " " << str.size() << endl;
    int aa = 1;
    int &&ba = std::move(aa);
    cout << ba << " " << aa << endl;
    cout << “-----------------” << endl;
    vector vecint{1,2,3,4};
    vector tt = double_vector(std::move(vecint));
    for (auto x : tt)
    {
    cout << x << " ";
    }
    cout << endl;
    cout << “-----------------” << endl;
    MoveTest m1;
    MoveTest m2=testCopy(m1);
    cout << “*****” << endl;
    MoveTest m3 = testCopy(std::move(m1));
    system(“pause”);
    return 0;
    }
    执行结果:
    在这里插入图片描述
    使用move之后,我们必须遵循一个承诺:move调用告诉编译器:我们有一个左值,但我们希望像一个右值一样处理它。我们必须 认识到,调用move就意味着承诺:除了对赋值或销毁它外,我们将不再使用它。在调用move之后,我们不能对移后源对象的值做任何假设。C++11的标准类库的说法就是——“仍然有效,但状态不明”
    我们在move之后,原来的元素使用的时候要再次初始化或者赋值(当然也看你的移动构造函数怎么实现的)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值