措辞:是否有差异b/w右值和右值引用
Wording : Is there a difference b/w rvalue and rvalue references?
假设我有以下对象
class foo
{
foo() {..} //Constructor
foo(const foo& f) {..} //Copy Constructor - `f` is lvalue reference
foo(foo&& g) {...} //Move constructor
};
现在我知道在语句
中 foo(const foo& f) {..}
f是一个左值引用
现在我的问题是,在语句
foo(foo&& g) {...}
我知道g
是一个右值,但我听到和读到这里和那里的人把g称为右值引用。我的问题是右值和右值引用之间的区别是什么,或者它们可以互换使用?
它们不一样。
在c++ 11中有三种类型的值:左值,x值("过期"值)和右值("纯"右值)。c++ 11中的右值由左值和右值组成。
左值是标识非临时对象或非成员函数的表达式。值得注意的是,即使x
是右值引用,表达式x
也是左值。从本质上讲,如果它是一个有名称的东西,它就是一个左值。
xvalue是一个表达式,用于标识一个即将过期的对象(可以从中移动)。这包括std::move(x)
,因为它返回一个右值引用,或者static_cast<X&&>(x)
右值标识临时对象或与任何对象无关的值;
右值引用只绑定到右值。因此,在
foo(foo&& f) {...}
f是绑定到右值(xvalue或右值)的右值引用,但表达式f
本身是左值。它有名字,你可以用&f
找到它的地址。右值引用的意义在于,f
绑定的对象是一个右值,因此可以安全地从
相关文章:
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 形成对对象的引用是否构成访问?
- C++ 引用是否在需要时隐式转换为值?
- 右值引用是否具有与右值引用相同的开销?
- 返回引用是否也会延长其生存期?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- 强制转换为指针引用是否会导致未定义的行为
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 结构化绑定和转发引用是否混合良好?
- 此常量引用是否保留了其生命?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 在 C++ 中更改越界指针的取消引用是否安全?
- 本地引用是否由"DetachCurrentThread"清除?
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- 常量右值引用是否允许对编译器进行额外优化?
- 如果参数传递两次,会发生什么情况?一次按值,一次按引用?是否会修改
- 返回强制引用是否安全