cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

Добавить в switch атрибут [[autobreak]] #422

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +7, -0 Автор идеи: Игорь Савенков

Собственно, предлагаю добавить в switch атрибут [[autobreak]] Из названия можно догадаться, что autobreak нужен чтобы меньше писать break;

Аргументы "за":

Имхо, ситуации, когда break пропущен и это сделано намеренно возникают значительно реже, чем когда он просто забыт по недосмотру, (яркое подтверждение этого - существование [[fallthrough]]). Поэтому неплохо бы иметь способ поменять поведение по-умолчанию.

С этим атрибутом код становится чуть лаконичнее. Вместо такого:

switch (direction) 
{
case Dir::left:
    moveLeft();
    break;
case Dir::right:
    moveRight();
    break;
default:
    notMove();
    break;
}

Будет немного более короткая версия. Ну и удастся избежать ошибок со случайно пропущенным break

[[autobreak]] switch (direction) 
{
case Dir::left:
    moveLeft();
case Dir::right:
    moveRight();
default:
    notMove();
}

Можно убрав переносы строк даже еще чутка сократить, почти не потеряв читаемость (но здесь уже вкусовщина)

[[autobreak]] switch (direction) 
{
case Dir::left:  moveLeft();
case Dir::right: moveRight();
default:         notMove();
}
apolukhin commented 3 years ago

iksk810, 20 марта 2019, 15:13 Лично я бы хотел вместо этого увидеть нечто похожее на when из kotlin-а. Например:

auto value = when(error_code) {
    network_error -> doSomething()
    database_error -> doAnother()
    user_error -> doSomethingElse()
    default -> doDefault()
}

Игорь Савенков, 21 марта 2019, 4:50 iksk810, а какое значение будет в value?

и я в описании синтаксиса when в kotlin видел ветку else. но не видел default. Перепутал?

https://kotlinlang.org/docs/reference/control-flow.html#when-expression

iksk810, 21 марта 2019, 5:32 В value будет ровно то, что вернёт конкретное выбранное выражение. Типы должны совпадать, разумеется.

Что касаемо синтаксиса, то это не так принципиально. На вкус и цвет. )

Andrey Davydov, 21 марта 2019, 9:55 Сейчас уже всерьез обсуждается настоящий pattern matching, причем ставят амбициозную цель успеть к C++23. Текущий proposal: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1371r0.pdf

Alexey Kreschuk, 21 марта 2019, 21:44 Насколько я помню, компилятор должен игнорировать неизвестные аттрибуты. Если он проигнорирует [[autobreak]], поведение программы изменится. Ловить эту проблему значительно сложнее, чем везде писать break, тем более что об отсутствии break'а есть warning.

Игорь Савенков, 22 марта 2019, 5:42 Alexey Kreschuk, да мне уже указали в "соседнем" предложении, что атрибуты плохо подходят для изменения поведения кода. Поэтому вот еще один вариант синтаксиса ниже ↓

Игорь Савенков, 22 марта 2019, 5:38 Меня сегодня на еще один вариант синтаксиса натолкнули, имхо, этот вариант лучше смотрится и + решает проблему с "обратной несовместимостью", которую не может решить атрибут:

int v = 0;

switch break (v)
{
    case 0: zero();
    case 1: one();
    default: default();
}
humanzer0 commented 2 years ago

Хотелось бы, чтобы просто завезли в плюсы нормальное сопоставление с образцом из функциональных языков.