首页 > 解决方案 > 为什么对箭头 (->) 运算符的调用失败?

问题描述

考虑以下代码:

#include <iostream>

class Test
{
public:
    Test() : a{ 0 }
    {}

    void print() const
    {
        std::cout << "a : " << a << std::endl;
    }

    void operator->()
    {
        a = 5;
    }

    void operator++()
    {
        ++a;
    }

public:
    int a;
};

int main()
{
    Test a;
    a.print();

    // Increment operator
    a.operator++();      // CORRECT
    ++a;                 // CORRECT
    a.print();

    // Indirection operator
    a.operator->();      // CORRECT
    a->;                 // INCORRECT
    a.print();
}

为什么对第二个->接线员的调用不正确?我知道这种用法->不同于一般用法,但标准不允许这种用法吗?

标签: c++operator-overloading

解决方案


CPP 标准草案 (N4713) 中关于从重载运算符访问类成员的小节说明了一点

16.5 重载运算符
...
16.5.6 类成员访问 [over.ref]
1.operator->应为不带参数的非静态成员函数。它实现了使用->.

postfix-expression -> template(opt) id-expression //This!!
postfix-expression -> pseudo-destructor-name

如果存在并且运算符被重载决策机制(16.3)选择为最佳匹配函数,则表达式x->m被解释为类型(x.operator->())->m的类对象。xTT::operator->()

如您所见,如果运算符重载,id-expression则非常需要。->


推荐阅读