C++ 为什么MSVC不解决此调用->;向过载操作员发送sth->;正确地

C++ 为什么MSVC不解决此调用->;向过载操作员发送sth->;正确地,c++,visual-c++,operator-overloading,clang,language-lawyer,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

考虑以下代码:

#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;
}
#包括
类LayoutConstraintInfo{
公众:
void print()常量{
std::cout()常量{return Ptr;}
公众:
void print()常量{
std::cout print();
}
};
int main(){
LayoutConstraint().print();
返回0;
}
程序因堆栈溢出异常而崩溃(MSVC 19.00.24215.1)

但是,看看这个示例,我希望得到以下输出:

CalledLayoutConstraint::打印

CalledLayoutConstraintInfo::Print

这是因为我希望调用
This->print()
调用重载的
layoutsconstraintinfo*操作符->()
操作符。 因此,调用
LayoutConstraint::Print
将调用
LayoutConstraintInfo::Print

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

我希望调用
this->print()
调用重载的
LayoutConstraintInfo*操作符->()
操作符

否。请注意,
操作符->
仅使用类本身类型的对象调用,而不是类的指针。这意味着当使用
布局约束调用时,将使用
操作符->()
,而不是
布局约束*
(例如
this
)。
this->print()
将始终直接调用成员函数
LayoutConstraint::print()
,这将导致无限递归

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

void print() const {
  std::cout << "Called LayoutConstraint::Print";
  (*this)->print();
}
void print()常量{
std::cout print();
}
顺便说一句:你可以用叮当声试试