*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

суббота, 12 июня 2010 г.

return со значением для void-функции

Я как-то думал, что для void-функций оператор return не может иметь ничего, кроме пробелов, перед завершающей его точкой с запятой. Оказывается, что нет. Visual Studio съела без каких-либо жалоб вот такой код:

void v() {}
void f(){ 
  return v();
}

int main() {
  f();
}

5 комментариев:

  1. Да, это специально ввели, когда темплейты стали широко использоваться.

    Т.к. делать дополнительную версию темплейтной функции, когда шаблонный тип возвращаемого значения - void, было неудобно и не концептуально.

    ОтветитьУдалить
  2. Это компилятор умничает и забивает на стандарт, считая, что раз v() возвращает void, то ничего страшного не происходит.
    Если форсировать компилятор следовать ISO C (в gcc это опция -pedantic), то он сразу начнет ругаться:
    "ISO C forbids 'return' with expression, in function returning void"

    ОтветитьУдалить
  3. Это не студия виновата, C++0x же =)
    g++ -std=c++0x тоже такое хавает

    ОтветитьУдалить
  4. 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-версий каждого из них.

    ОтветитьУдалить
  5. в gcc можно даже так
    void f()
    {
    return void();
    }

    ОтветитьУдалить