2017-01-14 17 views
3

Рассмотрим следующий код:Почему 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

ответ

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: Вы можете попробовать его с лязгом here.

 Смежные вопросы

  • Нет связанных вопросов^_^