函数返回int&
这个问题在这里已经有了答案:
int& foo()
是一个函数,它返回一个整数的(左值)引用。
引用就像一个指针,但不同于指针,它没有自己的身份。 它是目标的别名,而不是逻辑上的目标地址。
通常引用是作为指针来实现的,但引用的意义在于编译器经常可以完全删除它们的存在。 用指针来做这件事通常比较困难,因为他们的身份与他们所指的不同。
C ++没有办法获得引用的地址。 你可以得到一个包含引用的结构的地址,这个引用是如此接近以至于没有什么区别,但是你不能得到引用本身的地址。
int& foo()
返回一个整数的引用。 举个例子:
int x=0, y=0;
bool pick_x=true;
int& foo() { if (pick_x) return x; else return y; }
现在foo
根据pick_x
的状态返回对x
或y
任一个的引用。
您可以使用的返回值foo
几乎完全一样,如果它是x
(或y
如果!pick_x
。)
左值和右值来自C的日子。左值是可以在=
符号的左侧或右侧出现的表达式,并且右值是只能在=
符号的右侧出现的表达式。
在许多语言中,左值和右值可以用语法表示。 在C ++中,引用的存在意味着表达式的返回值可以是一个有效的事物,重载operator=
的存在意味着有时可以赋值rvalues。 所以事情变得棘手。
在C ++ 11中,添加了左值引用和右值引用。 每个拒绝绑定到其他类型的表达式。 还有转发引用,主要发生在模板类型推演中。
非const左值引用的语义与普通指针的语义完全相同,期望指针需要*
运算符来解引用它,而引用不需要。
所以你的
int& foo();
foo() = 42;
可以用指针的形式重新表达
int* foo();
*foo() = 42;
如果你在第二段代码中没有看到任何奇怪或不寻常的东西,那么在第一段代码中你不应该看到任何奇怪或不寻常的东西。
例如
int i;
int &foo() { return i; }
int *bar() { return &i; }
int main()
{
foo() = 42;
assert(i == 42);
*bar() = 24;
assert(i == 24);
}
链接地址: http://www.djcxy.com/p/20601.html