当我尝试编译以下代码时
int main()
{
unsigned char uc;
char & rc = uc;
}
g ++给出了以下错误:从'unsigned char'类型的表达式初始化'char&'类型的引用无效。使用signed char而不是unsigned char时会发生同样的情况。 但以下编译良好 p>
int main()
{
unsigned char uc;
const char & rc = uc;
}
为什么不能初始化'char&'使用'unsigned char'类型的变量,同时可以初始化'const char&'用它?
答案 0 :(得分:5)
为什么不能初始化'char&'使用'unsigned char'类型的变量,同时可以初始化'const char&'用它?
因为当unsigned char
转换为char
时,后者会创建一个临时绑定到const引用,这是非const引用无法做到的。 char
,signed char
和unsigned 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]最后,这个临时变量被用作值 初始化程序。