Я узнал, что следующий код принят Visual C++ 2008 и компиляторы GCC 4.3:
void foo()
{
}
void bar()
{
return foo();
}
Я немного удивлен, что это компилирует. Действительно ли это - функция языка, или действительно ли это - ошибка в компиляторах? Что стандарты C/C++ говорят об этом?
Это функция языка C ++
C ++ (ISO 14882: 2003) 6.6.3 / 3
Оператор возврата с выражением типа «cv void» может использоваться только в функциях с типом возврата cv void; выражение оценивается непосредственно перед тем, как функция вернется к вызывающему.
C (ISO 9899: 1999) 6.8.6.4/1
Оператор возврата с выражением не должен появляться в функции, тип возвращаемого значения недействителен.
Да, это действительный код. Это необходимо, когда у вас есть функции шаблона, чтобы вы могли использовать унифицированный код. Например,
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
Now, g
может быть перегружен, чтобы вернуть void, когда второй аргумент имеет определенный тип. Если "return void" был недопустимым, вызов f
прервался.