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();
}
顺便说一句:你可以用叮当声试试