Исключение оператора возврата в C++

У меня просто было некоторое странное поведение от версии 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?

21
задан Linearity 4 August 2010 в 02:30
поделиться

2 ответа

Отсутствие оператора 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 .

17
ответ дан 29 November 2019 в 21:16
поделиться

C и C ++ не требуют наличия оператора return . Возможно, он не нужен, потому что функция входит в бесконечный цикл или вызывает исключение.

Prasoon уже цитировал соответствующую часть стандарта:

[Раздел 6.6.3 / 2]

Оператор return с выражением может использоваться только в функциях, возвращающих значение; значение выражения возвращается вызывающей стороне функции. При необходимости выражение неявно преобразуется в тип возвращаемого значения функции, в которой оно появляется. Оператор возврата может включать в себя создание и копию временного объекта (класс. Временный). Выход за пределы функции эквивалентен возврату без значения; это приводит к неопределенному поведению функции, возвращающей значение.

Это означает, что отсутствие оператора возврата - это нормально. Но достижение конца функции без возврата - это неопределенное поведение .

Компилятор не всегда может обнаружить эти случаи, поэтому не обязательно, чтобы это была ошибка компиляции (ему необходимо решить проблему остановки, чтобы определить, достигнет ли выполнение когда-либо на самом деле конца функции ). Это просто undefined , что должно произойти, если это произойдет. Может показаться, что это работает (потому что вызывающая функция просто смотрит на любое значение мусора в том месте, где должно быть возвращаемое значение), он может дать сбой или заставить демонов вылететь из вашего носа.

13
ответ дан 29 November 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: