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