混淆右值ref作为返回类型的语义

问题描述

custom-button

调用get1()时,输出像合理的一样:

#include <iostream>
#include <algorithm>

using namespace std;

class A {
public:
    int *p;

    A () : p(new int(1)) {
        cerr << "construct " << p << endl;
    }

    A (A &a) noexcept: p(new int(*a.p)) {
        cerr << "copy " << p << endl;
    }

    A (A &&a) noexcept: p(a.p) {
        a.p = nullptr;
        cerr << "move " << p << endl;
    }

    ~A () {
        cerr << "destruct " << p << endl;
        delete p;
    }
};

A get1 () {
    A a;
    return std::move(a);
}

A &&get2 () {
    A a;
    return std::move(a);
}

int main () {
    A obj = get2();
    cerr << "obj:" << endl;
    cerr << obj.p << endl;
    cerr << *obj.p << endl;
}

Howeevr,当调用get2时,一次破坏在移动之前发生,并导致双重释放。

construct 0x7fe9ad405a00
move 0x7fe9ad405a00
destruct 0x0
obj:
0x7fe9ad405a00
1
destruct 0x7fe9ad405a00

看来,返回类型的差异会导致不同的转换顺序, 我只是不太确定这里的情况如何。 请问有人可以帮助我吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)