Неявный return в конце функции

Antervis
Antervis

Предлагаю ослабить требование к синтаксису функций, а именно: убрать требование к наличию ключевого слова return в её конце.

// Есть
int func(int a) {
    return a*5; 
}

// Предложение:
int func(int a) {
    a*5; 
}

Далее по тексту rv - возвращаемое значение

Требования: rv последнего оператора функции неявно преобразуется в rv функции. последний оператор не имеет побочных эффектов.

Подробнее по поводу второго:

auto func(int i) {
    i *= 5; // func вернет int(i*5). Сейчас это warning: statement has no effect
}


auto func(int &i) {
    i *= 5; // side effect - мутирующий доступ: func вернет void
}

auto func = [&i] { i *= 5; } // side effect - мутирующий доступ: func вернет void

Влияние на существующий код: для ситуаций, когда тип rv функции указан явно, изменение будет безвредным - в нынешнем стандарте это UB. Требование к отсутствию побочных эффектов разрешает возможную проблемную ситуацию со сменой типа rv для шаблонных функций и замыканий.

 

Для чего это всё: можно писать более короткие лямбды:

[](auto x) { x > 5; }

В дополнение также можно убрать требование к наличию ; у последнего оператора добавить неявный auto аргументам лямбд:

[](x) { x > 5 };

Подобное поведение сейчас есть в других яп, том же Rust

-12
рейтинг
5 комментариев
Павел Корозевцев
Это ломает старый код: все 3 func из второго примера возвращают void.
По поводу первых двух func оттдуда же: обе могли бы вернуть int. Почему существование side effect'а заставит меня писать return явно?
Павел Корозевцев
croessmah
"убрать требование к наличию ключевого слова return в её конце."
Понравилось, но дальнейшее описание явно ушло в другую сторону.
Я бы ослабил, убрав UB в случае, когда тип функции явно указан.
Например, для функции main имеется гарантия того, что в конце return 0;
Возможно, стоит подумать по этому поводу.
type f()
{
//неявный return type{};
}

Хотя не понятно что делать, например,
с типами, у которых нет дефолтного конструктора.
croessmah
Antervis
суть совершенно в другом - чтобы можно было возвращать определенное значение из функции, без ключевого слова return.
Antervis
croessmah
Antervis, на мой взгляд это не нужно, ничего кроме запутанности,
ухудшения читаемости и багов это не даст.
croessmah
Antervis
подумал и нашел способ не ломать существующий код:
auto func(int i) { return i + 5; }
auto func(int i) { i + 5 }
Если последний оператор функции не заканчивается точкой с запятой, к нему "добавляется" неявный return. Т.е. две функции сверху идентичны. Второй код (предложенный синтаксис) не должен компилироваться с текущим стандартом
Antervis
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).