我在网上查了一下发现一篇试图解释的文章std::move和右值 http://thbecker.net/articles/rvalue_references/section_01.html并发现了一些我实在无法掌握的东西。
int i = 42;
i = 43; // ok, i is an lvalue
int* p = &i; // ok, i is an lvalue
int& foo();
foo() = 42; // ok, foo() is an lvalue
int* p1 = &foo(); // ok, foo() is an lvalue
有什么意义int& foo()
?什么是foo() = 42
在这个例子中?
编辑:由于让我感到困惑并且与右值没有任何关系的部分我将编写解决我的问题的部分:
我不知道你可以在作用域内编写函数声明,因此 int& foo() 成为带有空初始值设定项的 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; }
now foo
返回对任一的引用x
or y
取决于状态pick_x
.
您可以使用返回值foo
几乎一模一样x
(or y
if !pick_x
.)
左值和右值来自 C 时代。左值是可以继续的表达式左还是右 of an =
符号,右值是只能在right of an =
sign.
在许多语言中,左值和右值可以用语法来表达。在C++中,引用的存在意味着表达式的返回值可以是可以赋值的有效值,而重载的存在operator=
意味着有时可以分配右值。所以事情变得棘手。
在 C++11 中,添加了左值引用和右值引用。每个表达式都拒绝绑定到其他类型的表达式。还有转发引用,主要发生在模板类型推导中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)