Является ли оператор return обязательным для функций С++, которые не возвращают void?
Книга My Herb Schildt на С++ говорит: "... В С++, если функция объявлена как возвращающая значение, она должна вернуть значение". Однако, если я пишу функцию с не-void возвращаемым типом и ничего не возвращаю, компилятор выдает предупреждение вместо ошибки: "Control достигает конца не-void-функции".
Я использую gcc (MinGW) и установил флаг -pedantic.
Ответы
Ответ 1
§6.6.3/2:
Вытекание конца функции эквивалентно возврату без значения; это приводит к поведению undefined в возвращающей значение функции.
Так что это зависит от вашего определения обязательного. Тебе обязательно? Нет. Но если вы хотите, чтобы ваша программа имела четко определенное поведение, да. *
* main
является исключением, см. п. 3.3.1/5. Если элемент управления достигнет конца main
без return
, он будет иметь эффект return 0;
.
Ответ 2
Это обязательно - это поведение undefined, когда такая функция заканчивается, не возвращая ничего (поэтому компиляторы могут реально реализовать какое-то особое поведение). Однако есть некоторые особые случаи.
::main
является исключением, предполагается, что return 0;
находится в конце его кода.
Кроме того, вам не нужно возвращать значение в функции, которая не возвращается чисто, f.e.:
int Foo() {
throw 42;
}
Ответ 3
Не обязательно иметь оператор return в функции, объявленной как возвращающий не-void, и это не должно приводить к поведению undefined.
Такая функция могла:
- Не возвращайся, скажем, введя бесконечный цикл
- Возврат путем исключения исключения
- Вызвать функцию, которая сама не возвращает, например
std::terminate
Конечно, если функция избегает поведения undefined, всегда выполняя одно из указанных выше, вероятно, не должна быть объявлена как возвращающая не-void, если это возможно.
Один очевидный случай, когда это необходимо, - это если это виртуальная функция, которая для определенной точки иерархии классов не может вернуть допустимое значение и всегда выходит из исключения.
Ответ 4
Да, он должен вернуть значение.
Оттекание конца функции эквивалент возврату без значения; это приводит к поведению undefined в функция возврата значения.
Этот вопрос принесет больше света теме
Ответ 5
Обязательно ли это? Я не верю в это, но не возвращать значение в функции возврата не-void undefined в соответствии с моим пониманием стандартов С++ (кроме main, которое возвращает 0).
Означает ли это, что это нормально? Вероятно, нет - если функция должна возвращать значение, вы должны вернуть ее, что может стать реальным беспорядочным в сложных базовых кодах.
Ответ 6
Забывание включить оператор return
в некоторый путь управления возвращающей значение функции не делает ваш код плохо сформированным. То есть вы обычно должны ожидать, что код будет компилироваться (возможно, с предупреждением). В этом смысле он не является "обязательным".
Тем не менее, на самом деле текущая функция возврата значений в С++ всегда работает undefined. (В C это поведение undefined, только если вызывающий код фактически использует результат.)
Ответ 7
Как и GMan, единственным исключением является основная функция. Я все еще вижу тонны книг, возвращающихся 0 в основном, что на самом деле не обязательно. Ну, я думаю, это может быть хуже, и вы можете учиться в книге, которая использует void main() вместо int main().
Но я думаю, что вы должны узнать из всего этого, что ваш компилятор жалуется по какой-то причине, и хорошо, что вы это заметили, так как он обычно сэкономит вам головные боли в долгосрочной перспективе.