首页 文章

将char赋值给int引用和C中的const int引用

提问于
浏览
10

我注意到将 char 分配给 const int& 编译,但将其分配给 int& 会产生编译错误 .

char c;
int& x = c;    // this fails to compile
const int& y = c;    // this is ok

我知道这样做不是一个好习惯,但我很想知道它发生的原因 .

我通过寻找"assigning to reference of different type","assigning char to a int reference"和"difference between const reference and non-const reference"搜索了一个答案,并发现了许多有用的帖子(int vs const int&Weird behaviour when assigning a char to a int variableConvert char to int in C and C++Difference between reference and const reference as function parameter?),但它们似乎没有解决我的问题 .

如果以前已经回答过,我很抱歉 .

3 回答

  • 3
    int& x = c;
    

    这里,编译器正在执行从 charint 的隐式转换 . 生成的临时 int 只能绑定到 const 引用 . 绑定到 const int& 还将延长临时结果的生命周期,以匹配绑定的引用的生命周期 .

  • 8

    此行为在标准N4527 8.5.3 / p5.2参考[dcl.init.ref]中是合理的

    5对类型“cv1 T1”的引用由类型“cv2 T2”的表达式初始化,如下所示:... 5.2否则,引用应为对非易失性const类型的左值引用(即,cv1应为const),或引用应为右值引用 . [例子:double&rd2 = 2.0; //错误:不是左值,而是引用不是const
    int i = 2;
    double&rd3 = i; //错误:类型不匹配,引用不是const

    • 结束例子]
  • 1

    这条线的事实

    const int& y = c;
    

    创建临时和 y 绑定到临时可以通过以下方式验证:

    #include <iostream>
    
    int main()
    {
       char c = 10;
       const int& y = c;
    
       std::cout << (int)c << std::endl;
       std::cout << y << std::endl;
    
       c = 20;
    
       std::cout << (int)c << std::endl;
       std::cout << y << std::endl;
    
       return 0;
    }
    

    输出:

    10
    10
    20
    10
    

    c 的值更改时, y 的值未更改 .

相关问题