关于重载 - >运算符的说明

3mr*_*3mr 6 c++ operator-overloading

我试图了解重载 - >运算符是如何工作的.我有以下课程

class Message {

public:
    Message(string message) :m_text(message) {}
    void printText() {
        cout << "text is " << m_text << endl;
    }
    string m_text;
};


class MessagePointerWrapper
{
public:

    MessagePointerWrapper(string message)  {
        m_message = std::make_unique<Message>(message);
    }

    Message* operator->() {

        return m_message.get();
    }

    std::unique_ptr<Message> m_message;

};

int main(int argc, char** argv)
{

    MessagePointerWrapper messageWrapper =  MessagePointerWrapper("Hello World");
    messageWrapper.m_message->printText();
    messageWrapper->m_text = "PQR";
    messageWrapper.m_message->printText();
}
Run Code Online (Sandbox Code Playgroud)

MessageWrapper级的->运算符重载以返回Message*.所以在主要方法中,当我调用messageWrapper->它返回的是一个Message*.通常当我有一个指针时,我需要使用->运算符或deference运算符来访问该对象.根据该逻辑,为了访问对象的m_text可用性Message,代码应该写成如下

(messageWrapper->)   // this returns a pointer to Message. so to access the object, I should write as
(messageWrapper->)->m_text = "PQR"
Run Code Online (Sandbox Code Playgroud)

要么

*(messageWrapper->).m_Text = "PQR"
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我需要称之为

messageWrapper->m_text = "PQR";
Run Code Online (Sandbox Code Playgroud)

我不明白这里的逻辑.我能否澄清一下这个问题.

==============

进一步说明:

在主要方法中,我看到以下两种方法做同样的事情

messageWrapper.operator->()->m_text = "JKH";

messageWrapper->m_text = "JKH";
Run Code Online (Sandbox Code Playgroud)

这是否意味着运营商的->工作方式与其他运营商不同

messageWrapper-> 等同于(messageWrapper.operator->())-> 而不是messageWrapper.operator->()其他运营商的情况.

son*_*yao 9

正如标准所述,[over.ref]/1

表达式x->m被解释为类型为if (x.operator->())->m的类对象x,T如果T::operator->()运算符被重载决策机制选为最佳匹配函数

这意味着messageWrapper->m_text是一种语法糖(messageWrapper.operator->())->m_text.您可以明确地应用后一种风格,但前者更有效.重载operator->使得可以像使用原始指针一样使用类,这就是智能指针喜欢std::unique_ptrstd::shared_ptr工作的方式.


Jea*_*nès 5

标准说:

13.5.6类成员访问

表达式x->m被解释为类型为if (x.operator->())->m的类对象x,T如果T::operator->()运算符被重载决策机制选为最佳匹配函数