c++11使用运算符时无符号字符变为int=

c++11使用运算符时无符号字符变为int=,c++,c++11,int,clang,C++,C++11,Int,Clang,使用运算符=,c++11无符号字符变为int,示例代码如下: #include <iostream> int main(int argc, char* argv[]) { class uchar { public: uchar(unsigned char c) : c_(c) { } private: unsigned char c_; }; const unsigned ch

使用运算符=,c++11无符号字符变为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和unsigned char,因为它们是两种不同的类型,并且不存在隐式转换。您可以重载运算符==但可以提供转换运算符,在适当的情况下将uchar表示为无符号字符:

operator unsigned char()
{
    return c_;
} 
这样就行了

为什么clang将c2报告为int


至于为什么Clang认为unsigned char是一个int,它在以后的版本中看起来像一个bug。

uchar是您的类。您需要重载运算符==@NeilButterworth使用clang 6.0或更低版本:问题是什么?为什么编译器将uchar标识为int,或者为什么您不能直接将无符号字符与uchar进行比较?@TerryWu有,但您不能比较两个uchar,因为您没有定义比较运算符。@TerryWu为什么会有隐式转换,uchar可以包含任何内容?