指派字符为int在C基准和const int的参考++(assigning char to int

2019-07-04 18:35发布

我注意到,分配charconst int&编译,但将其分配给int&给出了一个编译错误。

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

我明白,这是不是一个好的做法要做到这一点,但我很好奇,想知道为什么它发生的原因。

我已经寻找一个答案通过寻找“分配给不同类型的参考”,“以一个INT参考指派字符”和“常引用和非const引用之间的区别”,并在多个有用的帖子(就INT VS const int的和 , 分配一个char到一个int变量时怪异的行为 , 转换字符在C和C ++为int , 参考和const引用作为函数参数之间的区别是什么? ),但他们似乎并不是解决我的问题。

我的道歉,如果这已经被回答过了。

Answer 1:

int& x = c;

从这里的隐式转换charint正由编译器执行。 将所得的临时int只能被绑定到一个const参考。 结合到const int&也将延长临时结果的寿命相匹配,它被绑定到的参考。



Answer 2:

此行为在标准合理N4527在8.5.3 / P5.2参考文献[dcl.init.ref]

5.一种参考输入“CV1 T1”是通过键入“CV2 T2”如下的表达式进行初始化:

...

5.2否则,应参考是一个左值参照非易失性const的类型(即,CV1应常数),或参考应一个rvalue参考。 [实施例:

 double& rd2 = 2.0; // error: not an lvalue and reference not const int i = 2; double& rd3 = i; // error: type mismatch and reference not const 

- 端示例]



Answer 3:

事实上,行

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

y时的价值并没有改变c改变。



文章来源: assigning char to int reference and const int reference in C++