Функция должна иметь лишь одну точку выхода
Это правило применимо лишь к программам на Си. Вообще, множество переходов goto к одной точке выхода лучше, чем много операторов return. Этим способом вы можете поместить точку прерывания у единственной точки выхода, вместо того, чтобы возиться с несколькими прерываниями. Например§:
f()
{
int возвращаемое_значение = ОШИБКА;
if( некое_условие )
{
// ...
возвращаемое_значение = НЕЧТО;
goto выход;
}
else
{
// ...
возвращаемое_значение = НЕЧТО_ЕЩЕ;
goto выход;
}
выход:
return возвращаемое_значение;
}
Этот метод не срабатывает в Си++, потому что функции конструктора вызываются неявно в качестве части объявления; объявление часто скрывает вызов функции. Если вы пропускаете объявление, то вы пропускаете и вызов конструктора. Например, в следующей программе деструктор для x вызовется, а конструктор — нет:
foo()
{
if( некое_условие )
goto выход;
некий_класс x; // Конструктор не вызывается. (Оператор
// goto перескакивает через него.)
// ...
выход:
// Здесь вызывается деструктор для x
//
при выходе x из области видимости.
}
Вследствие этой проблемы лучше всего совсем избегать переходов goto в программах на Си++.