Вы всегда должны быть уверены, что ваш контейнер не пуст, прежде чем вызывать front () в этом экземпляре.
Вызов empty () в качестве безопасного охранника - это хорошо.
Конечно, в зависимости от дизайна вашей программы, всегда наличие непустого контейнера может быть инвариантным оператором, позволяющим вам предотвращать и сохранять вызов empty () каждый раз, когда вы вызываете front (). (или хотя бы в какой-то части вашего кода?)
Но, как указано выше, если вы хотите избежать неопределенного поведения в вашей программе, сделайте его сильным инвариантом.