以下代码:
const int &Rtest = 0;
我不确定为什么g ++接受这个(所有编译器都接受这个吗?)。我认为引用类型必须引用对象,而不是任意数字,那么 Rtest在这一点上是什么?它是如何用于编程的?
相反:
int &Rtest = 0;
不会编译,这对我来说很有意义,因为引用类型必须引用对象。
那么为什么使类型引用const int&
可以接受呢?
(我知道int
并不重要,这只是我碰巧使用的类型。)
答案 0 :(得分:1)
我不确定为什么g ++会接受这个
因为语言规范告诉它。您可以将某些类型的引用绑定到临时对象。这对于通过引用函数来传递临时值非常有用;在这样的其他环境中不太有用,但仍然允许使用。
所有编译器都接受这个吗?
是的,如果它们符合要求。
此时
Rtest
是什么?
对类型为int
且值为0的临时对象的引用。临时对象的生命周期将扩展为与引用的生命周期相匹配。
Temporaries只能绑定到const
或 rvalue 引用,这就是您的int&
示例无法编译的原因。
答案 1 :(得分:0)
因为根据C ++语言规则,const引用CAN附加到临时,但是常规引用不能。 这就是为什么第一个没问题,但第二个不是
const int &Rtest = 0;
这里0是暂时的,这就是Rtest可以引用它的原因
int &Rtest = 0;
这里0是临时的,但Rtest不是const引用,所以它不能引用它
有趣的是,VC ++确实接受了这种语法,虽然它不清楚它将0重新声明为变量或将其作为临时变量