arrow-> operator重载如何在c ++内部工作?

Rya*_*yan 39 c++ operator-overloading

我理解正常的运算符重载.编译器可以直接将它们转换为方法调用.我不太清楚 - >运算符.我正在编写我的第一个自定义迭代器,我觉得需要 - >运算符.我看了一下stl源代码并实现了我自己的代码:

MyClass* MyClassIterator::operator->() const
{
    //m_iterator is a map<int, MyClass>::iterator in my code.
    return &(m_iterator->second);
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用MyClassIterator的实例,如:

myClassIterator->APublicMethodInMyClass().
Run Code Online (Sandbox Code Playgroud)

看起来编译器在这里做了两个步骤.1.调用 - >()方法获取一个临时的MyClass*变量.2.在temp变量上调用APublicMethodInMyClass使用其 - >运算符.

我的理解是否正确?

Dav*_*eas 82

operator->具有在该语言,超载时,重新应用本身的结果特殊的语义.其余的运算符只应用一次,operator->编译器将根据需要多次应用到原始指针,再次访问该指针引用的内存.

struct A { void foo(); };
struct B { A* operator->(); };
struct C { B operator->(); };
struct D { C operator->(); };
int main() {
   D d;
   d->foo();
}
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,在表达式中d->foo(),编译器将获取对象d并应用于operator->它,从而生成一个类型的对象C,然后它将重新应用运算符以获取B,重新应用和获取的实例A*,之后它将取消引用该对象并获得指向的数据.

d->foo();
// expands to:
// (*d.operator->().operator->().operator->()).foo();
//   D            C            B           A*
Run Code Online (Sandbox Code Playgroud)

  • @MilindR:13.5.6/1 [...]*如果`T ::',表达式x-> m被解释为`(x.operator - >()) - > m`用于类型为T的类对象x operator - >()`存在并且如果操作符被重载决策机制选为最佳匹配函数*如果`x-> operator - >()`产生一个指针,它会被取消引用,如果它产生一个对象类型,重载`operator - >()`运算符被调用. (9认同)

dir*_*tly 29

myClassIterator->APublicMethodInMyClass()
Run Code Online (Sandbox Code Playgroud)

只不过是以下内容:

myClassIterator.operator->()->APublicMethodInMyClass()
Run Code Online (Sandbox Code Playgroud)

对重载的第一次调用operator->会获得某种类型的指针,该指针具有一个可访问的(来自您的调用站点)成员函数APublicMethodInMyClass().APublicMethodInMyClass()当然,遵循通常的功能查找规则来解决,这取决于它是否是虚拟的.

不一定是临时变量; 编译器可能会也可能不会复制返回的指针&(m_iterator->second).很可能,这将被优化掉.MyClass但是,不会创建任何类型的临时对象.

通常的警告也适用于m_iterator- 确保您的调用不访问无效的迭代器(vector例如,如果您正在使用).

  • 实际上它是`myClassIterator.operator - >() - > APublicMethodInMyClass()` (3认同)
  • @Potatoswatter我们应该阅读哪个链接?链接到谷歌搜索并没有那么有用. (2认同)