乍看起来,move语义使得你可以用廉价的move赋值替代昂贵的copy赋值,完美转发使得你可以将传来的任意参数转发给 其他函数,而右值引用使得move语义和完美转发成为可能。然而,慢慢地你发现这不那么简单,你发现std::move并没有move任何东西,完美转发也并不完美,而T&&也不一定就是右值引用……
move语义
最原始的左值和右值定义可以追溯到C语言时代,左值是可以出现在赋值符...
分类:
其他好文 时间:
2015-04-15 13:31:03
阅读次数:
150
本文为第七部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.html。Perfect Forwarding(完美转发):问题Move语义背后右值引用用来解决的另一个...
分类:
编程语言 时间:
2015-01-14 10:58:26
阅读次数:
167
右值引用,是 C++11 语言核心中最为重要的改进之一。右值引用给 C++ 带来了“Move语义”(“转移语义”),同时解决了模板编程中完美转发的问题(Perfect forwarding)。右值引用使 C++ 对象有能力甄别什么是(可以看作)临时对象,对于临时对象的拷贝可以做某种特别的处理,一般来...
分类:
编程语言 时间:
2014-12-19 23:14:24
阅读次数:
418
右值引用导言右值引用(及其支持的Move语意和完美转发)是C++ 11加入的最重大语言特性之一,这点从该特性的提案在C++ - State of the Evolution列表上高居榜首也可以看得出来。从实践角度讲,它能够完美解决C++ 中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了...
分类:
编程语言 时间:
2014-11-28 17:55:49
阅读次数:
322
std::move和std::forward是C++0x中新增的标准库函数,分别用于实现移动语义和完美转发。
下面让我们分析一下这两个函数在gcc4.6中的具体实现。
预备知识
引用折叠规则:
X& + & => X&
X&& + & => X&
X& + && => X&
X&& + && => X&&
函数模板参数推导规则(右值引用参数部分):
当函数模板的模板参数为...
分类:
编程语言 时间:
2014-11-25 18:30:49
阅读次数:
1005
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助。右值引用是C++11标准中新增的一个特性。右值引用允许程序员可以忽略逻辑上不需要的拷贝;而且还可以用来支持实现完美转发的函数。它们都是实现更高效、更健壮的库。move语义先不展开具体右值引用定义。先说...
分类:
编程语言 时间:
2014-11-01 06:12:29
阅读次数:
318
折腾C++的类型系统是一个很有意思的事情。当钻进去之后就会发现,一些原先比较晦涩的基本概念,在研究的过程中都清晰了不少。
check_type的实用价值在于,可以利用它清晰的看见C++中一些隐藏的类型变化。比如完美转发时的引用折叠。
在实现check_type的过程中,用到了不少泛型,甚至元编程的小技巧,充分运用了C++在预处理期、编译期和运行期(RAII)的处理能力。虽然这些代码仅是学习研究时的兴趣之作,实际项目中往往typeid的返回结果就足够了,但上面的不少技巧对一些现实中的项目开发也有一定的参考和...
分类:
编程语言 时间:
2014-05-16 01:44:26
阅读次数:
354