Очевидный ответ: потому что это не ошибка.Это только ошибка, если x
имеет значение false и если вызывающая сторона использует возвращаемое значение, ни одно из которых не может быть обязательно определено компилятором, по крайней мере, в общем случае.
В этом конкретном случае (возвращаяуказатель), было бы не сложно потребовать return
для всех путей;Ява делает это.В целом, однако, в C ++ нецелесообразно требовать этого, поскольку в C ++ вы можете возвращать пользовательские типы, для которых может быть невозможно создать значение (без конструктора по умолчанию и т. Д.). Таким образом, у нас есть ситуация, когда программистможет быть не в состоянии предоставить return
в ветке, которую, как он или она знает, не может быть взято, и компилятор не может определить, что ветка не может быть взята.
Большинство компиляторов предупредитв таких случаях, когда это может определить поток.Все те, что я видел, также предупреждают в некоторых случаях, когда явно невозможно упасть с конца, как бы то ни было.(И g ++, и VC ++ предупреждают о:
int
bar( char ch )
{
switch ( ch & 0xC0 ) {
case 0x00:
case 0x40:
return 0;
case 0x80:
return -1;
case 0xC0:
return 1;
}
}
, по крайней мере, с обычными опциями. Хотя совершенно очевидно, что эта функция никогда не падает до конца.)