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

Является ли оператор return обязательным для функций С++, которые не возвращают void?

Книга My Herb Schildt на С++ говорит: "... В С++, если функция объявлена ​​как возвращающая значение, она должна вернуть значение". Однако, если я пишу функцию с не-void возвращаемым типом и ничего не возвращаю, компилятор выдает предупреждение вместо ошибки: "Control достигает конца не-void-функции".

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

4b9b3361

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