我的代码:
#include <iostream>
using namespace std;
int a = 100;
int func();
int main()
{
int c = 10;
int & d = c;
// int & b = func();
int & b = a;
cout << b << endl;
return 0;
}
int func()
{
return a;
}
如果我打开通讯线路。我的g++编译器将提示错误cannot bind non-const lvalue referrence of type int& to an rvalue of type int
。这太奇怪了。这个语句与它的下一行int & b = a
非常相似。为什么它的下一行可以很好地工作,而不会提示相同的错误。
另一个奇怪的是,在我修改了我的函数定义后,我将其返回类型从int
修改为int &
,g++不会提示错误。
我通常使用java,上周刚刚学习了c++。我需要一些专家的帮助。
此语句与其下一行
int & b = a
非常相似。为什么它的下一行可以很好地工作,而不会提示相同的错误。
下一行之所以有效,是因为a
是一个左值。左值可以绑定到左值引用(兼容类型(。Rvalues不能绑定到对非常量类型的左值引用。
另一个奇怪的是,在我修改了func定义后,我将其返回类型从int修改为int&g++不会提示错误。
这是因为对返回左值引用的函数的调用也是一个左值表达式。
int & b = func();
和
int & b = a;
定义左值引用。
a
是一个左值。b
可以参考。
CCD_ 9不返回全局变量CCD_。它返回一个临时副本a
,一个prvalue。这个结果是如此短暂,它在行的末尾过期,引用它是毫无意义的。在使用引用之前,返回的值将无效,因此编译器会保护您免受运行时错误的影响。
但如果你做一个const
参考,
const int & b = func();
编译器将执行一些深层魔术来保存返回值
方便阅读:什么是rvalues、lvalues、xvalues、glvalues和prvalues?