我只是想知道为什么古代编译器如Turbo c ++ 3.0(蓝屏IDE)& Borland Turbo C ++ 4.5等不会报告以下程序中的任何错误。
#include <iostream.h>
int main()
{
int& a=10;
cout<<a;
return 0;
}
上述程序不会被现代C ++编译器接受,但为什么古代编译器会允许这样做呢?他们只是在上述程序中显示单个警告。
答案 0 :(得分:11)
它曾经是有效的C ++来绑定对临时的引用,所以你可以通过例如double
函数需要int&
,如The Design & Evolution of C++§3.7中所述:
但是,我犯了一个严重的错误,允许非const
引用由非左值初始化。 [...]
允许通过非左值初始化引用的原因是允许按值调用和按引用调用之间的区别是被调用函数指定的细节,并且对调用者不感兴趣。对于const
引用,这是可能的,对于非const
引用,它不是。对于版本2.0,更改了C ++的定义以反映这一点。
在C ++ 2.0(和ISO C ++)中,临时数只能绑定到const
引用。