代码之家  ›  专栏  ›  技术社区  ›  Piglet

显式类型转换真的有必要吗?

  •  0
  • Piglet  · 技术社区  · 5 年前

    Arduino的Liquidcystal库定义

     virtual size_t write(uint8_t);
    

    在他们的 example 您将发现对该函数的一些调用:

    lcd.write(byte(0)); // when calling lcd.write() '0' must be cast as a byte
    lcd.write((byte)1);
    lcd.write(4);
    

    我的C++有点生疏,所以我不知道为什么他们说它必须被转换成字节。

    我是说你不会做这样的事 byte a = byte(0); 正当

    根据我在C++引用中所记得和发现的,这种类型转换应该隐式发生,因此不需要在函数调用中显式地转换它。

    这个文档/示例是否和我认为的一样不一致和糟糕?还是我遗漏了什么?

    0 回复  |  直到 5 年前
        1
  •  4
  •   rustyx    5 年前

    我怀疑这是由于基类中的这两个重载造成的 Print :

    virtual size_t write(uint8_t);
    size_t write(const char *str);
    

    如果被称为 write(0) 这个 write(const char *) 重载将被选为更好的候选者(第一个需要缩小转换,但为0) 空指针)。

    所以要发一封信 0 字节,则必须使用显式强制转换来帮助编译器选择正确的重载: write((uint8_t)0) .


    此外,你还可以得到一个警告“ 缩小转换范围,可能会丢失数据 “如果你让一个较大的类型隐式地转换成一个较小的类型。因此,最好使用显式转换告诉编译器你知道自己在做什么。