请考虑以下代码:
#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
答案 0 :(得分:4)
我希望拨打
this->print()
来调用重载的LayoutConstraintInfo *operator->()
运营商。
没有。请注意,operator->
仅使用类本身类型的对象调用,而不是它的指针。这意味着在使用LayoutConstraint::operator->()
而不是LayoutConstraint
(例如LayoutConstraint *
)进行调用时,将使用this
。 this->print()
将始终直接调用成员函数LayoutConstraint::print()
,这会导致无限递归。
您可以将其更改为与LayoutConstraint
类型的对象一起使用,例如*this
。
void print() const {
std::cout << "Called LayoutConstraint::Print";
(*this)->print();
}
BTW:您可以使用clang here进行尝试。