Является ли объявление об использовании законным внутри оператора switch в каких-либо случаях? - PullRequest
3 голосов
/ 26 сентября 2019

Следующий код прекрасно компилируется в GCC 9.1 (-Wall -Wextra -Werror -g) без каких-либо предупреждений или ошибок, но clang-tidy дает мне OCDFAInspection warning: unreachable code.Так как в GCC есть все эти аддоны, например целочисленные диапазоны в случаях переключения, я обеспокоен тем, что это может быть другой аддон , который на самом деле не является допустимым C ++.

Так что следующий код допустим вC ++ (17, если это имеет значение)?

namespace foo {
    void bar() {}
}

int main() {
    int n = 42;

    switch (n) {
        using namespace foo; // <- is this valid?
        case 42: 
            bar();
            break;
        default: 
            break;
    }
}

1 Ответ

4 голосов
/ 26 сентября 2019

Оператор switch забавен, потому что его синтаксис выглядит примерно так:

switch (expression) statement

А здесь statement может быть любым заявление.Компилятор обрабатывает ключевое слово case, default и break по-разному в области действия switch, но в противном случае вы можете иметь любой оператор по вашему желанию, включая операторы блока (заключенные в фигурные скобки списки операторов), с чем угодно.want.

Проблема с универсальными операторами вне регистра заключается в том, что они не будут выполнены.Сгенерированный код будет переходить к определенной метке case (или кейсу default), пропуская все операторы, которые не являются частью кейса.

Но для этого конкретного случая это, как упомянуто вкомментарий, ложный положительный.Используемая здесь директива using дает указание компилятору добавить пространство имен foo к поиску символов, но оно само не создает и не генерирует исполняемый код.

...