Хотя существует реальная опасность передачи foo
аргумента, который не затронет ни одно из return
утверждений, предупреждение не зависит от enum или от опасности. Вы можете увидеть тот же эффект с bool
, в операторе switch, который (насколько я могу судить) абсолютно водонепроницаем.
В общем, компилятор не достаточно умен, чтобы определить, охватили ли вы все возможные пути, которые элемент управления мог бы фактически пройти через оператор switch
. Чтобы быть таким умным, он должен был бы иметь возможность вывести все возможные состояния, которых может достичь программа, прежде чем войти в switch
, что ведет прямо к проблеме остановки.
Таким образом, дедукция должна где-то остановиться, и (по крайней мере, с помощью gcc) она остановится с определением, что нет случая по умолчанию и что поэтому элемент управления может быть в состоянии покинуть switch
без нажатия return
.