我阅读了这个问题,我知道rvalue引用是lvalue。
然而,在这段代码示例1中,
int &&fun() {
return 1;
}
int main() {
int &a = fun();
}
我来翻译一下,这段内容的意思是:“当我编译它时:”。
error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
所以C++编译器告诉我fun
的返回类型是一个右值。
一个右值引用如何变成一个右值?
我认为编译器应该以相同的方式处理左值引用和右值引用,但这段代码,例如2,
int & fun(){
int b;
return b;
}
int main(){
int & a=fun();
}
可以进行编译(尽管我收到了一个警告)。
我认为fun
的返回类型可能在某个时候发生了变化。
尝试编译示例3:
int &&fun() {
return 1;
}
int main() {
decltype(fun()) b = 1;
}
编译成功。因此,我可以说fun
的返回类型确实是一个右值引用。
那么,为什么右值引用会变成右值呢?
这里有第四个例子:
int &&a = 1;
int &b = a;
它编译并告诉我们rvalue引用可以绑定到lvalue引用。
现在,对于这两个问题:
- 在示例1中,
fun()
是rvalue吗? - 在示例1中,
fun()
是rvalue引用吗?
示例3告诉我们fun()
是rvalue引用,示例4告诉我们rvalue引用可以绑定到lvalue引用(包括const和非const)。那么为什么示例1中的fun()
不能绑定到lvalue引用呢?
示例4还表明rvalue引用是一个lvalue,但是示例1中的编译错误告诉我们,在示例3中被证明是rvalue引用的fun()
是一个rvalue。那么,rvalue引用是lvalue还是rvalue?
如果原因是fun()
只是一个存在一会儿就会消失的表达式,为什么示例2中的fun()
不被认为是rvalue,而它也只是一个没有名称的表达式?一个返回lvalue引用和rvalue引用的函数表达式之间有什么区别?