所以这是我的小班:
class test{
public:
int& addressofx();
private:
int x;
};
int& test::addressofx(){
return x;
}
这是主要的:
int main(){
test a;
int& foo = a.addressofx();
}
为什么上面编译正常,但是当我将函数addressofx变成常规int函数(而不是int&)时,我会得到错误?
你可以这样做:
int x;
int &y = x;
没有获取x的地址,但是当你从函数返回x时你需要它的地址吗?为什么呢?
答案 0 :(得分:1)
你没有回复任何地址。您正在返回reference。
此代码将返回一个地址:
class test {
public:
int* addressofx();
private:
int x;
};
int* test::addressofx() {
return &x;
}
int main() {
test a;
int* foo = a.addressofx();
}
答案 1 :(得分:0)
INT&安培; addressofx();
这会将引用返回给int
变量。
INT&安培; foo = a.addressofx();
这是声明非const
左值引用(左值表示它已为其分配变量名称,即它可以显示在左侧表达式),包含对int变量的引用。由于函数返回对int的引用,编译器很高兴。
当我将函数addressofx变成常规int函数(而不是int&)时,我得到错误?
非const
左值引用无法绑定到临时值(如果进行更改,addressofx()
将返回该值。这就是 rvalue 引用(在C ++ 11中引入)被设计用来处理,但是你没有在这个例子中使用该功能。
你可以这样做:
int x;
int& y = x;
因为您声明左值引用并将其绑定到左值变量。这是允许的。
如果您更改addressofx()
以返回int
(右值,因为它没有名称,因此它只能出现在表达式的右侧) ,返回值不能绑定到非const
左值引用,因为它不是真正的变量。但是,可以绑定到const
左值引用(然后编译器会将临时的生命周期延长到函数的返回值之外),例如:< / p>
int addressofx();
...
const int& foo = a.addressofx();
简而言之,您需要了解参考的工作原理,以及左值和右值之间的区别。并非所有组合都可以一起使用。