C++ 将int赋值给double&;
我想了解为什么这不能编译:C++ 将int赋值给double&;,c++,reference,C++,Reference,我想了解为什么这不能编译: int main() { int a = 1; double& b = a; std::cout << b; } intmain() { INTA=1; 双b=a; std::coutAdouble和Aint在内存中有不同的对齐要求和表示形式。通过另一种类型的眼睛读取一个变量作为一种类型也会使程序具有未定义的行为 当你做这样的事情时 int a = 1; double b = a; // note, not a refe
int main()
{
int a = 1;
double& b = a;
std::cout << b;
}
intmain()
{
INTA=1;
双b=a;
std::coutAdouble
和Aint
在内存中有不同的对齐要求和表示形式。通过另一种类型的眼睛读取一个变量作为一种类型也会使程序具有未定义的行为
当你做这样的事情时
int a = 1;
double b = a; // note, not a reference
然后将a
隐式转换为临时double
,然后分配给b
double& b = a;
然后b
尝试引用该临时double
,这是无效的,因为临时值将在表达式末尾被销毁
但是,您可以通过使用常量&
将临时变量的寿命延长到表达式末尾之外。然后,临时变量的寿命将延长到引用寿命的末尾(范围的末尾)
例如:
const double& b = a; // valid, but usually pointless
关于你对问题的补充:
使用double const&b=a
而不是double&b=a
可以正常工作
那只是因为“标准上这么说”一个临时的非代码> const和<代码>意味着你要对那个临时性的改变——这通常是个错误,你可能会想要一个<代码>双< />代码,而不是一个<代码>双和>。在这种情况下,你想让程序做什么?因为类型不匹配。C++试图阻止你犯下一个大错误。ke.twool&
如何引用int
变量?!你确定你理解了什么是引用吗?即使int
和twool
大小相同,这样你就不会在读取twool
变量时,比如32位int
,int
的字节编码也不会出错ense被解释为一个double
。1)我的程序较长,但没有必要显示它,问题是这些行2)如果我使用双常量&=a,它会工作,所以我不理解为什么它使用常量工作,而不使用。3)我认为它会自动将a的类型从int转换为double感谢我对编程非常陌生o同样,最简单的事情对你来说也不是那么明显me@DavideLP不客气,我完全明白为什么这不明显。我只是注意到你添加了一个关于const&
的内容,所以我在末尾添加了一个关于这一点的注释。为了扩展微妙的区别,int a=5;int const&b=a;a=6;
现在b也是6。int a=5;double const&b=a;a=6;
但b仍然是5.0,因为它是未命名临时文件的别名。@Eljay是的,很好的说明!