【问题标题】:Narrowing conversion缩小转换
【发布时间】:2020-03-29 10:32:55
【问题描述】:
#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;
}

我想知道为什么我会收到此检查/警告/提示

Clang-Tidy:从“int”缩小到有符号类型“char”的转换是实现定义的

我唯一要做的就是获取 char 并“大写”它,以防它还没有,所以我不必在我的开关上处理 2 个案例。 有谁知道我必须改变什么才能摆脱这个,所以我会把它完全绿色化,因为这是唯一的问题? 看来我缺乏一些关于转换的知识。

谢谢!

printscreen

【问题讨论】:

  • 伙计,我已经阅读了关于这个问题的主题,但我没有阅读正确的主题。我现在写了 return static_cast(toupper(static_cast(selection)));就像注释中所说的那样,我摆脱了那张支票。但只是因为我看到了我应该如何编写它并且只是修改了我的代码 - 理解它,好吧,我没有,因为注释很短。我们甚至根本无法解释为什么我们会收到该消息。朋友的相同代码没有显示这样的消息,但他使用 codelite 和 c++17。因此,可能存在版本或 IDE 问题。艾伦,非常感谢。

标签: c++ integer implicit-conversion narrowing


【解决方案1】:

在这个函数中

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) );
}

【讨论】:

  • 啊哈,这和C函数toupper有关!现在它更有意义了,使用这段代码确实解决了这个问题。所以,我会阅读更多关于这些函数的信息,这样当我收到类似的消息时,我就会知道它可能是什么,因为我不知道 int 是 C 函数 toupper 的返回类型——我刚刚和你一起学习。我想知道 C++ 是否有 this is upperthings 作为方法,就像我们可以写 return selection.upper;或类似的东西。感谢您的回答,弗拉德!
  • @Kelarov char 类型不是用户定义的类型。所以它没有方法。
  • 啊哈。所以这些方法适用于数组、向量等...... - 对象,对吧?现在似乎更有意义了哈哈!方法太好了哈哈。我不知道它们不能与 char 类型一起使用哈哈。我们生活,我们学习!非常感谢,弗拉德。
【解决方案2】:

另一个不依赖于实现定义行为的解决方案是:

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

此版本的toupper 返回与输入相同的类型。

【讨论】:

  • 伙计,这是真的!有用!相同的检查内容甚至建议删除 #include 标头。似乎标题特定于此实现/toupper/C 函数。非常感谢您让我知道这种方法。
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2014-01-01
  • 2012-11-07
相关资源
最近更新 更多