У меня просто было некоторое странное поведение от версии g ++ для Windows, который я получил с Земляничным Perl. Это позволило мне опускать оператор возврата.
У меня есть функция членства, которая возвращает структуру, состоящую из двух указателей, названных a boundTag
:
struct boundTag Box::getBound(int side) {
struct boundTag retBoundTag;
retBoundTag.box = this;
switch (side)
{
// set retBoundTag.bound based on value of "side"
}
}
Эта функция дала мне некоторый плохой вывод, и я обнаружил, что это не имело никакого оператора возврата. Я означал возвращаться retBoundTag
но забыл на самом деле писать оператор возврата. После того как я добавил return retBoundTag;
все было прекрасно.
Но я протестировал это функциональное и корректный полученный boundTag
вывод от него. Даже сейчас, когда я удаляю оператор возврата, g ++ компилирует его без предупреждения. WTF? Это предполагает для возврата retBoundTag
?
Отсутствие оператора return
в непустой функции
[За исключением main ()
] и использование возвращенного значения в вашем коде вызывает Undefined Поведение .
ISO C ++ - 98 [Раздел 6.6.3 / 2]
Может использоваться оператор возврата с выражением только в функциях, возвращающих значение; значение выражения вернулся к вызывающей функции. При необходимости выражение неявно преобразуется в тип возвращаемого значения функции, в которой он появляется. Оператор возврата может включать построение и копию временный объект ( класс.временный ). Оттекающий от конца функция эквивалентна возврату без значения; это приводит к неопределенное поведение в функции возврата значения .
Например
int func()
{
int a=10;
//do something with 'a'
//oops no return statement
}
int main()
{
int p=func();
//using p is dangerous now
//return statement is optional here
}
Обычно g ++ выдает предупреждение : элемент управления достигает конца непустой функции
. Попробуйте скомпилировать с опцией -Wall
.
C и C ++ не требуют наличия оператора return
.
Возможно, он не нужен, потому что функция входит в бесконечный цикл или вызывает исключение.
Prasoon уже цитировал соответствующую часть стандарта:
[Раздел 6.6.3 / 2]
Оператор return с выражением может использоваться только в функциях, возвращающих значение; значение выражения возвращается вызывающей стороне функции. При необходимости выражение неявно преобразуется в тип возвращаемого значения функции, в которой оно появляется. Оператор возврата может включать в себя создание и копию временного объекта (класс. Временный). Выход за пределы функции эквивалентен возврату без значения; это приводит к неопределенному поведению функции, возвращающей значение.
Это означает, что отсутствие оператора возврата - это нормально. Но достижение конца функции без возврата - это неопределенное поведение .
Компилятор не всегда может обнаружить эти случаи, поэтому не обязательно, чтобы это была ошибка компиляции (ему необходимо решить проблему остановки, чтобы определить, достигнет ли выполнение когда-либо на самом деле конца функции ). Это просто undefined , что должно произойти, если это произойдет. Может показаться, что это работает (потому что вызывающая функция просто смотрит на любое значение мусора в том месте, где должно быть возвращаемое значение), он может дать сбой или заставить демонов вылететь из вашего носа.