为什么运算符>重载在 VC2010 中不起作用?

Why does operator-> overloading not work in VC2010?

本文关键字:VC2010 不起作用 重载 运算符 gt 为什么      更新时间:2023-10-16
class A
{
public:
    A* operator->() const
    {
    }
    void Test() {}
};

然后这样称呼它。

A* a = new A;
a->Test();

代码在 VC2010 中成功生成并运行。这似乎很奇怪。我想知道这是设计使然还是VC2010的错误?

谢谢

您在示例中不是在调用operator->,而是直接从A*调用Test。你想要:

(*a)->Test();

或。。。

A a;
a->Test();

VS2010在operator->方面没有任何问题(据我所知)。

在名为 a 的指针上使用 -> 可以有效地执行:(*a). 。按值对变量使用 -> 将调用您的operator->(如果存在),如果没有operator->,则会成为语法错误。

你的代码是:

A* a = new A;
a->Test();

"a"是指向 A 的指针。 它本身不是 A 对象,而是堆上 A 对象的内存地址。

调用a->Test()时,会调用指针的 -> 运算符(C++ 中所有指针类型都内置)。 您必须执行此操作才能调用运算符:

//Create an A (NOT a pointer).
A a;
//Invoke the A's operator ->
a->Test();

这就是 STL 迭代器的工作方式 - 它们是类类型,而不是指向类类型的指针。 请注意,运算符 -> 的返回类型必须对尝试调用的操作/成员有意义。

因此,下面是一个通过 -> 调用 test 的示例:

#include <iostream>
class A
{
public:
    A* operator->()
    {
        return this;
    }
    void Test() { std::cout << "Hello World!"; }
};
int main()
{
    A a;
    a->Test();
}

这很奇怪,但它有效,因为a->Test();返回当前对象,然后调用Test()对象(请参阅return this;行)。

请参阅 STL 迭代器,了解您实际想要这样做的原因的有用示例。