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

Игорь Савенков
Игорь Савенков

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

Имхо, ситуации, когда 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();
}

 

4
рейтинг
7 комментариев
iksk810

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

auto value = when(error_code) {
    network_error -> doSomething()
    database_error -> doAnother()
    user_error -> doSomethingElse()
    default -> doDefault()
}
iksk810
Игорь Савенков

iksk810, а какое значение будет в value?

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

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

Игорь Савенков
Обновлено 
iksk810

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

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

iksk810
Andrey Davydov

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

Andrey Davydov
Alexey Kreschuk

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

Alexey Kreschuk
Игорь Савенков

Alexey Kreschuk, да мне уже указали в "соседнем" предложении, что атрибуты плохо подходят для изменения поведения кода. Поэтому вот еще один вариант синтаксиса ниже

Игорь Савенков
Обновлено 
Игорь Савенков

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

int v = 0;

switch break (v)
{
    case 0: zero();
    case 1: one();
    default: default();
}
Игорь Савенков
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения