Компилятор не применяет это, потому что у вас есть знания о том, какие пути практически возможны, что нет в компиляторе. Компилятор обычно знает только об этом конкретном файле, а не о других, которые могут повлиять на поток внутри любой заданной функции. Таким образом, это не ошибка.
В 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 преуспеет. Возможно, есть побочные эффекты этих тестов, поэтому они должны быть сделаны. Было бы лучше написать его без «else if»? Может быть. Вероятно. Но дело в том, что это законный C++, и компилятор не может знать, можно ли выйти без оператора return. Это, я согласен, уродливое и плохое кодирование, но это законно, и Visual Studio даст вам предупреждение, но оно будет компилироваться.
Помните, что C++ не защищает вас от вас самих. Речь идет о том, чтобы позволить вам делать то, что желает ваше сердце, в пределах ограничений языка, даже если это включает в себя стрельбу в ногу.
Какой компилятор вы используете? – Dennis
Если на gcc используйте ['-Wreturn-type'] (http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html), возможно с' -Werror = '. –
То же самое случилось со мной с gcc 4.4 –