【问题标题】:c++11 unsigned char becoming int when using operator =c ++ 11 unsigned char在使用运算符=时变为int
【发布时间】:2018-11-18 12:48:03
【问题描述】:

c++11 unsigned char在使用operator=时变成int,示例代码如下:

#include <iostream>

int main(int argc, char* argv[]) {
    class uchar {
    public:
        uchar(unsigned char c)
        : c_(c) {

        }
    private:
        unsigned char c_;
    };
    const unsigned char c2 = 5;
    uchar c1(5);

    // output: 1 1
    std::cout << sizeof(c1) << " " << sizeof(c2) << std::endl; 
    // compile error: invalid operands to binary expression ('uchar' and 'int')
    std::cout << (c1 == c2) << std::endl; 
}

有人能解释一下为什么会出现上述错误吗?为什么 clang 将 c2 报告为 int?

使用 clang++ v6.0 -std=c++11

【问题讨论】:

  • uchar 是你的班级。你需要重载operator==
  • @NeilButterworth 使用 clang 6.0 或更低版本:wandbox.org/permlink/v7J38Y6ME3uPKE1Q
  • 问题是什么?为什么编译器将uchar 识别为int,或者为什么不能直接将unsigned charuchar 进行比较?
  • @TerryWu 有,但您无法比较两个uchars,因为您没有定义比较运算符。
  • @TerryWu 为什么会有隐式转换,uchar 可以包含任何东西?

标签: c++ c++11 int clang


【解决方案1】:

有人能解释一下为什么会出现上述错误吗?

首先,您不能直接将ucharunsigned char 进行比较,因为它们是两种不同的类型,并且不存在隐式转换。您可以重载operator==,但您可以提供转换运算符,在适当的时候将您的uchar 表示为unsigned char

operator unsigned char()
{
    return c_;
} 

这样就可以what you expect

为什么 clang 将 c2 报告为 int?

至于为什么 Clang 认为 unsigned charint,它看起来像一个 bug,因为它在以后的版本中是 doesn't do this

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2018-02-27
    • 2022-01-04
    • 1970-01-01
    • 2012-04-28
    • 2012-05-06
    • 2023-02-08
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多