返回信息流cplusplus.com上有这么一段话
Generally, rvalues are values whose address cannot be obtained by dereferencing them, either because they are literals or because they are temporary in nature (such as values returned by functions or explicit constructor calls). By passing an object to this function, an rvalue that refers to it is obtained.
意思是字面值和临时变量可以作为右值吗?那右值引用又是什么意思,跟引用对比有什么效果?
这是一条镜像帖。来源:北邮人论坛 / cpp / #87458同步于 2015/6/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++11中如何理解右值引用 type&&
inaadversity
2015/6/9镜像同步28 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Part of the rvalue and rvalue reference history:
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
看懂这个你就知道为什么要有 rvalue,剩下的概念 reasoning 一下就能得出结论了
【 在 buptxrc 的大作中提到: 】
: 为了识别一个参数是不是 “右值”,从而实现移动语义和完美转发
: 个人理解= =
可不可以说'object'都能作为右值呢
你说的移动语义和完美转发,是指对象被拷贝,然后原对象被销毁吗?
【 在 iFadeToBlack 的大作中提到: 】
: Part of the rvalue and rvalue reference history:
: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
: 看懂这个你就知道为什么要有 rvalue,剩下的概念 reasoning 一下就能得出结论了
略长啊。。。能不能简述一下呢
简单说就是:不能
详细说就是:如果你想知道的话最好读一下
【 在 inaadversity 的大作中提到: 】
:
: 略长啊。。。能不能简述一下呢
好吧,我花时间阅读一下,多谢~
【 在 iFadeToBlack 的大作中提到: 】
: 简单说就是:不能
: 详细说就是:如果你想知道的话最好读一下
:
举个例子吧。
一个正常的类,拷贝构造函数可能需要做两件事:1.申请地址空间;2.将资源复制过来。
struct Foo {
char* _data;
size_t _length;
Foo(const Foo& obj) {
_length = obj._length;
_data = new char[obj._length + 1];
std::copy(obj._data, obj._data + _length, _data);
}
};
这样,一个拷贝构造函数其实就可以正常工作了。
但是,当参数obj是一个临时对象时,即obj不会在被其他地方用到,或者说obj的生命周期要结束了, 那这次复制就显得很浪费,因为可以直接把它从obj中“移动过来”。 也就是说,需要这么一个函数:
Foo(dying Foo obj) {
_length = obj._length;
_data = obj._data;
obj._data = nullptr;
}
当然,dying不是一个C++关键字,只是为了表示obj的生命周期即将结束,或者说是“将亡”。
如果有了这么一个构造函数来减少不必要的复制,那将是极好的。
所以总得来说:为了解决临时对象拷贝带来的效率低下,需要实现移动语义;实现移动语义的前提是能够识别出参数中“将亡”对象。
于是就有了右值引用&&,作用就是用来绑定“将亡”对象,于是把上面的函数参数“dying Foo obj”替换成“Foo&& obj”:
Foo(Foo&& obj) {
_length = obj._length;
_data = obj._data;
obj._data = nullptr;
}
所以,右值引用有什么用?。。。。
原文地址 http://cstdlib.com/tech/2014/07/12/new-features-in-c++11/
【 在 inaadversity 的大作中提到: 】
:
: 可不可以说'object'都能作为右值呢
: 你说的移动语义和完美转发,是指对象被拷贝,然后原对象被销毁吗?
【 在 inaadversity 的大作中提到: 】
: cplusplus.com上有这么一段话
: Generally, rvalues are values whose address cannot be obtained by dereferencing them, either because they are literals or because they are temporary in nature (such as values returned by functions or explicit constructor calls). By passing an object to this function, an rvalue that refers to it is obtained.
: 意思是字面值和临时变量可以作为右值吗?那右值引用又是什么意思,跟引用对比有什么效果?
那右值引用又是什么意思: 右值引用的意思就是引用一个右值。[左值简单的理解,就是你可以比较轻松的获知它的地址,而右值就是非左值。 ] 之前 C++ 不支持右值引用, 比如 int &i = 1; 1是个右值,#你不知道1的地址是什么。 而c++11 通过int &&j =1; 这个语法,就能引用到常数1了。
跟引用对比有什么效果? 不清楚你所谓的效果是不是问右值引用的功能何在,意义何在。 那就是上面的哥们解释的,会在声明类的move构造函数里使用, 所谓move构造函数,里面并没有move, 而是通过move函数,讲一个对象变成右值对象, move(obj)得到的就是一个obj的右值版本。 如果你关心std::move是什么样的? 可以google一下std::move。