Является ли оператор return обязательным для функций C ++, которые не возвращают void? - PullRequest
20 голосов
/ 07 мая 2010

Моя книга Херба Шильдта на C ++ гласит: «... В C ++, если функция объявлена ​​как возвращающая значение, она должна вернуть значение». Однако, если я пишу функцию с типом возврата, не являющимся пустым, и ничего не возвращаю, компилятор выдает предупреждение вместо ошибки: «Управление достигает конца функции, не являющейся пустым.»

Я использую gcc (MinGW) и установил флаг -pedantic.

Ответы [ 7 ]

28 голосов
/ 07 мая 2010

§6.6.3 / 2:

Выход из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.

Так что это зависит от вашего определения обязательного. У вас есть ? Нет. Но если вы хотите, чтобы ваша программа имела четко определенное поведение, да. *

*main является исключением, см. §3.6.1 / 5. Если управление достигает конца main без return, оно будет иметь эффект return 0;.

10 голосов
/ 07 мая 2010

Это обязательно - это неопределенное поведение, когда такая функция заканчивается, не возвращая ничего (поэтому компиляторы могут фактически реализовать какое-то специальное поведение). Однако есть некоторые особые случаи.

::main является исключением, предполагается, что return 0; находится в конце своего кода.

Кроме того, вам не нужно возвращать значение в функции, которая не возвращает чисто, например ::100100

int Foo() {
    throw 42;
}
6 голосов
/ 07 мая 2010

Не обязательно иметь оператор return в функции, объявленной как возвращающая не void, и это не должно приводить к неопределенному поведению.

Такая функция могла бы:

  • Не вернуть, скажем, введя бесконечный цикл
  • Возврат с помощью исключения
  • Вызов функции, которая сама не возвращает, например, std::terminate

Конечно, если функция избегает неопределенного поведения, всегда выполняя одно из вышеперечисленных действий, ее, вероятно, не следует объявлять возвращающим не void, если возможно.

Один очевидный случай, когда это потребуется, если это виртуальная функция, которая для определенной точки в иерархии классов не может вернуть допустимое значение и всегда завершается через исключение.

4 голосов
/ 07 мая 2010

Да, он должен возвращать значение.

Вытекает из конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в функция, возвращающая значение.

Этот вопрос даст больше света предмету

1 голос
/ 07 мая 2010

Забыть о включении оператора return в некоторый путь управления функцией, возвращающей значение, не делает ваш код плохо сформированным.Т.е. вы обычно должны ожидать компиляции кода (возможно, с предупреждением).В этом смысле он не является «обязательным».

Однако фактическое вытекание из функции возврата значения в C ++ всегда неопределенное поведение.(В C это неопределенное поведение, только если вызывающий код действительно использует результат.)

1 голос
/ 07 мая 2010

Это обязательно? Я не верю в это, однако не возвращать значение в функции, не возвращающей void, не определено согласно моему пониманию стандартов c ++ (кроме main, который возвращает 0).

Значит ли это, что все в порядке? Вероятно, нет - если функция должна возвращать значение, вы должны возвращать значение, которое может привести к путанице в сложных кодах.

0 голосов
/ 07 мая 2010

Как сказал GMan, единственным исключением является основная функция. Я до сих пор вижу тонны книг, возвращающих 0 в основном, что на самом деле не нужно. О, хорошо, я думаю, что могло быть и хуже, и вы могли бы учиться из книги, которая использует void main () вместо int main (). Но я думаю, что вы должны извлечь из всего этого, что ваш компилятор жалуется по какой-то причине, и это хорошо, что вы приняли это к сведению, так как это, как правило, избавит вас от головной боли в долгосрочной перспективе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...