【发布时间】:2018-11-05 19:23:15
【问题描述】:
我阅读了this 问题,我知道右值引用是左值。
但是,对于此代码,示例 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的返回类型确实是一个右值引用。
那么,为什么右值引用会变成右值呢?
这里是示例 4:
int &&a = 1;
int &b = a;
它编译并告诉我们一个右值引用可以绑定到一个左值引用。
现在,那两个问题呢:
- 在示例 1 中,
fun()是右值吗? - 在示例 1 中,
fun()是右值引用吗?
示例 3 告诉我们 fun() 是一个右值引用,示例 4 告诉我们一个右值引用可以绑定到一个左值引用(常量和非常量)。那为什么示例 1 中的 fun() 不能绑定到左值引用?
示例 4 也表明一个右值引用是一个左值,但是示例 1 中的编译错误告诉我们那里的fun(),在示例 3 中被证明是一个右值引用,是一个右值。那么,右值引用是左值还是右值?
如果原因是fun()只是一个表达式,它暂时存在,马上就会死掉,为什么示例2中的fun()不被视为右值,而它也只是一个没有名字的表达式?返回左值引用和右值引用的函数的函数表达式有什么区别?
【问题讨论】:
标签: c++ return-type rvalue-reference rvalue lvalue