移动赋值参数在取消引用时会抛出错误,但在直接访问成员时有效

问题描述 投票:0回答:1

在所需的最少代码片段中,在移动分配中,为什么注释行

*arg = nullptr;
非法而
arg.p = nullptr;
可以?如果我理解正确的话,两者都在修改右值,但在编译时
*arg = nullptr;
会产生错误:

左操作数必须是左值

由于运算符重载,我希望

*arg
能够提供对
arg
p
的访问。

#include <iostream>

using namespace std;

class Ptr {
public:
    Ptr(double arg) :p{ new double(arg) } {}
    // copy constructor
    Ptr(const Ptr& arg) {
        p = new double(*(*arg));
    }
    // move assignment
    Ptr& operator=(Ptr&& arg) {
        delete p;
        p = *arg;
        cout << "move type of *arg " << typeid(*arg).name() << endl;
        arg.p = nullptr;
        //*arg = nullptr; // illegal
        return *this;
    }
    // operator *, allows to read and write *p
    double* operator*() {
        return p;
    }
    const double* operator*() const {
        return p;
    }
    ~Ptr() {
        delete p;
    }
private:
    double* p;
};

Ptr copy(Ptr a) { return a; }


int main() {
    Ptr pt{ 2 };
    Ptr pt2{ 3 };
    pt2 = copy(pt);
    return 0;
}

尝试过 chatGpt 寻求帮助,但是,它认为我正在尝试将指针分配给 double ,这显然不是这种情况,因为如果我这样做

cout << "type of *arg " << typeid(*arg).name()<<endl;
就会看到指针类型。

c++ pointers move-semantics rvalue
1个回答
0
投票

由于运算符重载,我希望 *arg 能够提供对 arg 的 p 的访问。

问题是重载的operator*

按值返回,这意味着对这些函数的调用是右值表达式。

要解决

这个问题,您可以通过左值引用返回指针,如下所示。 //---------v------------------>return by reference double*& operator*() { return p; }

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.