我注意到,分配char
的const 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引用作为函数参数之间的区别是什么? ),但他们似乎并不是解决我的问题。
我的道歉,如果这已经被回答过了。
int& x = c;
从这里的隐式转换char
到int
正由编译器执行。 将所得的临时int
只能被绑定到一个const
参考。 结合到const int&
也将延长临时结果的寿命相匹配,它被绑定到的参考。
此行为在标准合理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
- 端示例]
事实上,行
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
改变。