【问题标题】:g++ gives error : invalid initialization of reference of type ‘char&’ from expression of type ‘unsigned char’g++ 给出错误:从“unsigned char”类型的表达式中对“char&”类型的引用进行无效初始化
【发布时间】:2013-07-03 16:47:30
【问题描述】:

当我尝试编译以下代码时

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 &'?

【问题讨论】:

    标签: c++ reference initialization


    【解决方案1】:

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

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

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

    【讨论】:

    • charsigned char有什么区别?
    • @AlexandruBarbarosie:在某些编译器上,char 可能未签名。但是忽略这一点,这三种类型始终是三种不同的类型,即使其中两种行为相同。这对指针、引用、函数重载和模板参数产生了影响。
    • @AlexandruBarbarosie, char 可以是有符号的或无符号的——这取决于实现——但正如明确指出的,这三个都是不同的类型,所以它不像一个实现可以做到typedef signed char char;
    【解决方案2】:

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

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

    更改以下内容:

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

    【讨论】:

      【解决方案3】:

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

      Bjarne Stroustrup 在他的《C++ 编程语言》第三版一书中写道:

      § 5.5 参考文献

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        相关资源
        最近更新 更多