Не обязательно иметь оператор return в функции, объявленной как возвращающая не void, и это не должно приводить к неопределенному поведению.
Такая функция могла бы:
- Не вернуть, скажем, введя бесконечный цикл
- Возврат с помощью исключения
- Вызов функции, которая сама не возвращает, например,
std::terminate
Конечно, если функция избегает неопределенного поведения, всегда выполняя одно из вышеперечисленных действий, ее, вероятно, не следует объявлять возвращающим не void, если возможно.
Один очевидный случай, когда это потребуется, если это виртуальная функция, которая для определенной точки в иерархии классов не может вернуть допустимое значение и всегда завершается через исключение.