Рассмотрим следующий код:Почему MSVC не разрешить вызов this-> STH к перегруженной операторнозначным> правильно
#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, похоже, не жалуются, но у меня нет какой-либо версии Clang на моем ПК с Windows