Возвращает пустой действительный код?

Я узнал, что следующий код принят Visual C++ 2008 и компиляторы GCC 4.3:

void foo()
{

}

void bar()
{
  return foo();
}

Я немного удивлен, что это компилирует. Действительно ли это - функция языка, или действительно ли это - ошибка в компиляторах? Что стандарты C/C++ говорят об этом?

56
задан Rakete1111 13 May 2018 в 13:24
поделиться

2 ответа

Это функция языка C ++

C ++ (ISO 14882: 2003) 6.6.3 / 3

Оператор возврата с выражением типа «cv void» может использоваться только в функциях с типом возврата cv void; выражение оценивается непосредственно перед тем, как функция вернется к вызывающему.

C (ISO 9899: 1999) 6.8.6.4/1

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

70
ответ дан 26 November 2019 в 17:14
поделиться

Да, это действительный код. Это необходимо, когда у вас есть функции шаблона, чтобы вы могли использовать унифицированный код. Например,

template<typename T, typename P>
T f(int x, P y)
{
  return g(x, y);
}

Now, g может быть перегружен, чтобы вернуть void, когда второй аргумент имеет определенный тип. Если "return void" был недопустимым, вызов f прервался.

51
ответ дан 26 November 2019 в 17:14
поделиться