我有3个问题。
1.流动的2个代码之间有什么区别?
//why no errors during compiling as flowing
const int& get3() {
return 3;
}
和
//get a compiler error, says: 'return': cannot convert from 'int' to 'int &'
//and that's understandable
int& get3() {
return 3;
}
2.为什么第一个可以编译?
3.当我运行第一个时,我得到了奇怪的结果:
那是为什么?
如果有人能给我一些提示,我会非常感激。
答案 0 :(得分:3)
使用int& get3()
,您可以执行get3() = 5
。
这将设置函数get3
返回其引用的变量的值为5
。
由于3
是一个常量值,没有地址可用作参考,因此会出现编译错误。
此类函数通常返回对类成员变量的引用。
答案 1 :(得分:1)
第一个实际上不确定,即使它编译。它返回对本地临时的引用,这是一个未定义的行为(因为该函数退出后该临时函数被销毁,因此您将获得一个悬空引用)。编译器应该通过发出警告告诉你这个问题。
基本上它等同于以下内容:
const int& get3() {
const int& x = 3; // bind const reference to a temporary, OK
return x; // return a reference to a temporary, UB
}
这也回答了你的第三个问题:
因为您的代码中有UB。
我还建议您阅读this brilliant answer。