Сужение конверсии - PullRequest
       87

Сужение конверсии

0 голосов
/ 29 марта 2020
#include <iostream>
#include <vector>
#include <cctype>

using namespace std;

char get_selection() {
    char selection{};
    cin >> selection;
    return toupper(selection);
}

int main() {
    char selection {};
    do{
        selection = get_selection();
        switch(selection){
           ...
        }
    } while(selection!='Q');

    cout<<endl;
    return 0;
}

PS: я скопировал только соответствующий код

Я знаю, что это не ошибка, так как он не отмечен желтым), но я хотел бы знать, почему я получаю эту проверку / предупреждение / tip (Clang-Tidy: сужающее преобразование из int в подписанный тип char определяется реализацией). Единственное, что я там делаю, это получаю символ и «прописываю» его, на случай, если это еще не так, поэтому мне не нужно обрабатывать 2 случая на моих переключателях. Кто-нибудь знает, что я должен изменить, чтобы избавиться от этого, чтобы я получил полностью зеленый, так как это единственная проблема? Похоже, мне не хватает знаний о конверсии.

Спасибо!

printscreen

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Другое решение, не основанное на поведении, определяемом реализацией:

return toupper(selection, std::locale());

Эта версия toupper возвращает тот же тип, что и входные данные.

0 голосов
/ 29 марта 2020

В этой функции

char get_selection() {
    char selection{};
    cin >> selection;
    return toupper(selection);
}

компилятор делает неявное преобразование из типа int, типа возвращаемого значения функции C toupper, в тип char.

Чтобы избежать предупреждение сделать явное преобразование, например, как

char get_selection() {
    char selection{};
    cin >> selection;
    return char( ::toupper( ( unsigned char )selection) );
}
...