4

当我尝试编译以下代码时

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

g++ 给出以下错误:从“unsigned char”类型的表达式中对“char&”类型的引用进行无效初始化。使用有符号字符而不是无符号字符时也会发生同样的情况。但是以下编译得很好

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

为什么不能用“unsigned char”类型的变量来初始化“char &”,而可以用它来初始化“const char &”?

4

3 回答 3

5

为什么不能用“unsigned char”类型的变量来初始化“char &”,而可以用它来初始化“const char &”?

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

普通字符、有符号字符和无符号字符是三种不同的类型

于 2013-07-03T16:50:56.183 回答
0

我今天遇到了这个错误,只想分享我的发现。

Bjarne Stroustrup 在他的《The C++ Programming Language》第三版一书中写道:

§ 5.5 参考文献

当初始化器是左值(您可以获取其地址的对象;参见 §4.9.6)时,引用的初始化是微不足道的。''plain'' T&的初始值设定项必须是T类型的左值。

const T& 的初始值设定项不必是左值,甚至不必是 T 类型。在这种情况下,

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

[2] 然后,将结果值放入 T 类型的临时变量中,并且

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

于 2015-02-17T08:32:55.863 回答
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;
}
于 2013-07-03T17:14:12.950 回答