Является ли оператор 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(). Но я думаю, что вы должны извлечь из всего этого, что ваш компилятор жалуется по какой-то причине, и это хорошо, что вы приняли это к сведению, так как это, как правило, избавит вас от головной боли в долгосрочной перспективе.

Другие вопросы по тегам