void
-функций оператор return
не может иметь ничего, кроме пробелов, перед завершающей его точкой с запятой. Оказывается, что нет. Visual Studio съела без каких-либо жалоб вот такой код:void v() {}
void f(){
return v();
}
int main() {
f();
}
Да, это специально ввели, когда темплейты стали широко использоваться.
ОтветитьУдалитьТ.к. делать дополнительную версию темплейтной функции, когда шаблонный тип возвращаемого значения - void, было неудобно и не концептуально.
Это компилятор умничает и забивает на стандарт, считая, что раз v() возвращает void, то ничего страшного не происходит.
ОтветитьУдалитьЕсли форсировать компилятор следовать ISO C (в gcc это опция -pedantic), то он сразу начнет ругаться:
"ISO C forbids 'return' with expression, in function returning void"
Это не студия виновата, C++0x же =)
ОтветитьУдалитьg++ -std=c++0x тоже такое хавает
Qehgt прав, это зашито в стандарте, пункт 6.6.3/3: 'A return statement with an expression of type“cv void” can be used only in functions with a return type of cv void'. Дико удобно когда есть цепочка шаблонных вызовов, и в некоторых случаях у них тип возврата void. Не нужно выписывать код для void-версий каждого из них.
ОтветитьУдалитьв gcc можно даже так
ОтветитьУдалитьvoid f()
{
return void();
}