为什么MSVC没有解决对此过度调用的问题 - > sth来重载operator->正确地

时间:2017-01-14 13:10:44

标签: c++ visual-c++ operator-overloading clang language-lawyer

请考虑以下代码:

#include <iostream>

class LayoutConstraintInfo {
public:
  void print() const {
    std::cout << "Called LayoutConstraintInfo::Print";
  }
};

class LayoutConstraint {
  LayoutConstraintInfo *Ptr;
  LayoutConstraintInfo *operator->() const { return Ptr; }

public:
  void print() const {
    std::cout << "Called LayoutConstraint::Print";
    this->print();
  }
};

int main() {
  LayoutConstraint().print();
  return 0;
}

程序因堆栈溢出异常而崩溃(使用MSVC 19.00.24215.1)。

但是,看一下这个样本,我希望得到以下结果:

  

CalledLayoutConstraint ::打印

     

CalledLayoutConstraintInfo ::打印

这是因为我希望调用this->print()来调用重载的LayoutConstraintInfo *operator->()运算符。 因此,拨打LayoutConstraint::Print的电话会调用LayoutConstraintInfo::Print

我发现这个将一个Clang项目移植到MSVC:MSVC发出一个警告,指示递归导致运行时堆栈溢出。 Clang似乎没有抱怨,但我的Windows PC上没有任何版本的Clang

1 个答案:

答案 0 :(得分:4)

  

我希望拨打this->print()来调用重载的LayoutConstraintInfo *operator->()运营商。

没有。请注意,operator->仅使用类本身类型的对象调用,而不是它的指针。这意味着在使用LayoutConstraint::operator->()而不是LayoutConstraint(例如LayoutConstraint *)进行调用时,将使用thisthis->print()将始终直接调用成员函数LayoutConstraint::print(),这会导致无限递归。

您可以将其更改为与LayoutConstraint类型的对象一起使用,例如*this

void print() const {
  std::cout << "Called LayoutConstraint::Print";
  (*this)->print();
}

BTW:您可以使用clang here进行尝试。