Пример переполнения стека на C++

Представьте, что у вас есть кусочек кода следующего содержания:

operator int() const {
    return *this;
}

Всё бы ничего, но тут имеется некоторая проблема. Что не так, спросите вы? Чтобы ответить на этот вопрос, посмотрим на полный код:

class Foo {
public:
    operator int() const {
        return *this;
    }
};

int main() {
    Foo foo;
    int i = foo;
    return 0;
}

Этот код без проблем скомпилируется, хотя ряд компиляторов может сказать warning. Но когда вы этот код запустите, вы столкнётесь с переполнением стека, словив stack overflow.

В чём же дело?

Оказывается, что в нашем коде operator int старается привести возвращаемое значение к типу int. И это можно сделать, ведь для текущего объекта мы имеем прекрасный operator int, который, собственно говоря, это и делает.

Таким образом, функция вызывает сама себя и продолжает это делать рекурсивно, то есть до тех пор, пока стек не переполнится.