Компилятор не применяет это, потому что вы знаете, какие пути практически возможны, а компилятор - нет.Компилятор обычно знает только об этом конкретном файле, а не о других, которые могут повлиять на поток внутри любой данной функции.Так что это не ошибка.
В Visual Studio это предупреждение.И мы должны обратить внимание на все предупреждения .... верно?:)
Редактировать : Кажется, есть некоторые дискуссии о том, когда это может произойти.Вот модифицированный, но реальный пример из моей личной библиотеки кодов:
enum TriBool { Yes, No, Maybe };
TriBool GetResult(int input) {
if (TestOne(input)) {
return Yes;
} else if (TestTwo(input)) {
return No;
}
}
Имейте в виду, потому что это старый код.Первоначально там было «возможно, еще возврат».:) Если TestOne и TestTwo находятся в другом модуле компиляции, то когда компилятор нажимает этот код, он не может сказать, могут ли TestOne и TestTwo оба возвращать false для данного входа.Вы, как программист, написавший TestOne и TestTwo, знаете, что если TestOne завершится неудачей, TestTwo будет успешным.Возможно, у этих тестов есть побочные эффекты, поэтому они должны быть выполнены.Было бы лучше написать это без "если еще"?Может быть.Наверное.Но дело в том, что это допустимый C ++, и компилятор не может знать, можно ли выйти без оператора return.Я согласен, это некрасивое и нехорошее кодирование, но это законно, и Visual Studio выдаст вам предупреждение, но скомпилирует.
Помните, что C ++ не предназначен для защиты вас от себя.Речь идет о том, чтобы позволить вам делать то, что ваше сердце желает в рамках языковых ограничений, даже если это включает в себя выстрел в себя.