Функция с отсутствующим возвратным значением, поведение во время выполнения

Как и ожидалось, компилятор (VisualStudio 2008) даст предупреждение

предупреждение C4715: «doSomethingWith»: не все пути управления возвращают значение

при компиляции следующего кода:

int doSomethingWith(int value) { int returnValue = 3; bool condition = false; if(condition) // returnValue += value; // DOH return returnValue; } int main(int argc, char* argv[]) { int foo = 10; int result = doSomethingWith(foo); return 0; } 

Но программа работает отлично. Возвращаемое значение функции doSomethingWith () равно 0.

Является просто неопределенным поведением или существует определенное правило, как результат / результат вычисляется во время выполнения. Что происходит с не-POD-типами данных как возвращаемое значение?

Неопределенное поведение, указанное в стандарте ISO C ++, раздел 6.6.3:

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

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

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

Не возвращать значение из функции возврата значения приводит к неопределенному поведению.

Обновление ответа @piotr.

Из Стандартной секции C ++ 17 9.6.3

Вытекание конца конструктора, деструктора или функции с возвратным типом cv void эквивалентно возврату без операнда. В противном случае, выключение конца функции, отличной от главной (6.6.1), приводит к неопределенному поведению.

  • Динамический генерировать столбец mvvm
  • При чтении CSV-файла с использованием DataReader и поставщика данных OLEDB Jet, как я могу управлять типами данных столбцов?
  • Пользователи выходят очень быстро
  • Что произойдет, если я не вызову Dispose на объекте пера?
  • Создание запланированных задач
  • Структура Entity Framework и уровень изоляции транзакций
  • Может ли Unity быть сделано, чтобы не вызывать синхронное исключение Exception все время?
  • Как гарантировать порядок оценки аргументов при вызове функционального объекта?
  • Почему C # реализует методы как не виртуальные по умолчанию?
  • Применение формата% number к значению ячейки с использованием OpenXML
  • Как избежать дублирования кода, реализующего константные и неконстантные iteratorы?
  • Interesting Posts

    Медиа-запросы: как настроить таргетинг на настольные системы, highcharts и мобильные устройства?

    объекты data.table, назначенные с помощью: = из функции, не напечатанной

    ЖДИТЕ для «любого процесса», чтобы закончить

    Как добавить пользовательский заголовок Http для веб-службы C #, использующий веб-службу Axis 1.4

    Использование указателя после free ()

    Невозможно скомпилировать простой проект Java 10 с Maven

    Почему CheckBoxFor создает дополнительный тег ввода и как я могу получить значение с помощью FormCollection?

    Magento «Контроллер фронтального controllerа достиг 100 итераций с использованием маршрутизатора»

    Открытие книги Excel 2003 в Excel 2010 32-бит вызывает ложную циркулярную ссылку и сбои

    Кнопки управления внутри уведомлений об андроидах

    В чем разница функций и методов в Go?

    Console.ReadLine () максимальная длина?

    LINQ to Entities не распознает метод ‘System.Web.Mvc.FileResult’

    NoSuchElementException с Java.Util.Scanner

    Как предотвратить восстановление файлов в общей папке (C: \ Users \ Public)?

    Давайте будем гением компьютера.