Эти ошибки являются ошибками до C ++ 17. До C ++ 17 аргумент / параметр шаблона шаблона должен точно соответствовать.
Но так как добавление P0522R0 к стандарту, правило менее строгое, и этот код компилируется.
На сегодняшний день, я думаю, что только GCC реализует его, и вам нужно указать стандарт: gcc -std=c++17
см. Здесь .
Компилятор будет иногда превращать переключатель в таблицу переходов, если записи будут непрерывны (или почти так). Или это могло теоретически использовать двоичный поиск для нахождения случая вместо линейной последовательности тестов, которые были бы быстрее, если бы у Вас было большое количество случаев.
С другой стороны, нет ничего мешающего компилятору делать те же оптимизации на том же коде, преобразованном в если/еще.
Таким образом на хорошем компиляторе, переключатель может быть быстрее в некоторых случаях. На очень хорошем компиляторе они были бы тем же.
В этом конкретном случае, switch
может быть превращен в таблицу переходов. if
оператор (если Вы пишете Ваш =
как ==
:-P), мог все еще сделать то же самое, если компилятор мог бы сказать это x
не изменяется между if
пункты (который обычно имеет место, если x
volatile
или что-то).
Обратите внимание также, что, если/еще конструкция может быть более эффективной, если Вы знаете, определенные случаи более вероятны, чем другие.