g ++给出错误:从'unsigned char'类型的表达式无效初始化'char&'类型的引用

时间:2013-07-03 16:47:30

标签: c++ reference initialization

当我尝试编译以下代码时

int main()
{
    unsigned char uc;
    char & rc = uc;
}

g ++给出了以下错误:从'unsigned char'类型的表达式初始化'char&'类型的引用无效。使用signed char而不是unsigned char时会发生同样的情况。 但以下编译良好

int main()
{
    unsigned char uc;
    const char & rc = uc;
}

为什么不能初始化'char&'使用'unsigned char'类型的变量,同时可以初始化'const char&'用它?

3 个答案:

答案 0 :(得分:5)

为什么不能初始化'char&'使用'unsigned char'类型的变量,同时可以初始化'const char&'用它?

因为当unsigned char转换为char时,后者会创建一个临时绑定到const引用,这是非const引用无法做到的。 charsigned charunsigned char是三种不同的类型,如C ++11§3.9.1中所述:

  

Plain char,signed char和unsigned char是三种不同的类型

答案 1 :(得分:0)

“C ++编译器将char,signed char和unsigned char类型的变量视为具有不同类型的变量。”

以下链接将澄清:http://msdn.microsoft.com/en-us/library/cc953fe1.aspx

更改以下内容:

int main()
{
    unsigned char uc;
    unsigned char& rc = uc;
}

答案 2 :(得分:0)

我今天遇到了这个错误,只想分享我找到的内容。

Bjarne Stroustrup在他的书“The C ++ Programming Language”第三版中写道:

  

§5.5参考文献

     

当初始化器是a时,初始化引用是微不足道的   左值(一个可以采用其地址的对象;见§4.9.6)。该   “普通” T& 的初始化程序必须是 T 类型的左值。

     

const T&的初始化器不必是左值甚至是T型   在这种情况下,

     

[1]首先,必要时应用隐式类型转换为T(参见   §C.6)

     

[2]然后,结果值放在一个临时变量中   输入T和

     

[3]最后,这个临时变量被用作值   初始化程序。