Ответ 1
Это поведение Undefined, как указано в стандарте ISO С++, раздел 6.6.3:
Оттекание конца функции эквивалент возврату без значения; это приводит к поведению Undefined в функция возврата значения.
Как и ожидалось, компилятор (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.
Is - это просто поведение undefined, или существует определенное правило, как создается или вычисляется значение результата во время выполнения. Что происходит с не-POD-типами данных как возвращаемое значение?
Это поведение Undefined, как указано в стандарте ISO С++, раздел 6.6.3:
Оттекание конца функции эквивалент возврату без значения; это приводит к поведению Undefined в функция возврата значения.
Для процессоров x86 стандартное соглашение о вызове помещает возвращаемое значение в регистр EAX. Практически это означает, что для большинства компиляторов, если мы дойдем до конца функции без возврата, результат последней математической операции будет возвращен. Однако вы не можете полагаться на него, и он не переносится.
Не возвращать значение из функции возврата значения приводит к поведению undefined.
Обновление ответа @piotr.
Из С++ 17 Standard Раздел 9.6.3
Отбрасывание конца конструктора, деструктора или функции с тип возврата cv void эквивалентен возврату без операнда. В противном случае, выходя из конца функции, отличной от основной (6.6.1) приводит к поведению undefined.