Это правильный код C ++ 17?
Да, это действительно. Ровно один оператор возврата будет отброшен, а другой останется. Даже если ничего не осталось, C ++ по-прежнему позволяет вам опустить оператор возврата из функции. Вы получаете неопределенное поведение, если достигается закрывающая фигурная скобка функции, но это риск, только если выполнение достигает этой точки.
В вашем случае выполнение не может достичь такой точки, поэтому UB невозможен.
В чем причина этой ошибки?
Вы использовали -Werror
, превратив предупреждение о ложном срабатывании компилятора в серьезную ошибку. Одним из обходных путей является отключение этого предупреждения вокруг этой конкретной функции. Это просто проблема качества реализации.