&&

  universal references(未定的引用类型),它必须被初始化,它是左值还是右值取决于它的初始化,如果&&被一个左值初始化,它就是一个左值;如果它被一个右值初始化,它就是一个右值;只有当发生自动类型推断时(如函数模板的类型自动推到,或auto关键字),&&才是一个universal references.

template<typename T>
void f(T&& param); //这里T的类型需要推导,所以&&是一个universal references f(10); //10是右值
int x = 10;
f(x); //x是左值 template<typename T>
class Test{
Test(Test&& rhs); //已定义特定的类型,&&是一个右值引用
}; template<typename T>
void f(std::vector<T>&& param); //&&右值引用类型,因为在调用这个函数之前,vector<T>中的推断类型已经确定了,到调用f的时候没有类型推断 template<typename T>
void f(const T&& param); //右值引用类型,universal references仅仅在T&&下发生,任何附加条件都会使之失效

  引用折叠:由于存在T&&这种类型,当它作为参数的时候,可能被一个左值引用或右值引用的参数初始化,这时经过类型推导的T&&类型,相比右值引用会发生类型的变化

折叠规则:

  1. 所有的右值引用叠加到右值引用上仍然还是一个右值引用(A&& && 变成 A&&)
  2. 所有的其他引用类型之间的叠加都将变成左值引用(A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&)

  通过typeid(t).name()可以获取到数据类型,但在不同的编译器下,可能不完整;

//msvc
std::cout << typeid(T).name() << std::endl; //gunc 通过__cxa_demangle将低级符号名解码(demangle)成用户级名字 头文件 #include <cxxabi.h>
char *real_name = abi::__cxa_demangle(typeid(T).name(), nullptr, nullptr, nullptr);
std::cout << real_name;
free(real_name);

std::move

  move实际上并不能移动任何东西,它唯一的功能是将一个左值强制转换为一个右值引用,方便实现移动构造。

std::forward 和 完美转发

  完美转发是指在函数模板中,完全依照模板的参数的类型,将参数传递给函数模板中调用的另外一个函数。

template<class T>
void Print(T & t)
{
std::cout << "lvalue : " << t << std::endl;
} template<class T>
void Print(T &&t)
{
std::cout << "rvalue : " << t << std::endl;
} template<class T>
void TestForward(T&& t)
{
Print(t);
Print(std::forward<T>(t));
Print(std::move(t));
} void test()
{
TestForward(1);
int x = 1;
TestForward(x);
TestForward(std::forward<int>(x));
}

万能函数包装器

template <class Function, class... Args>
inline auto FuncWrapper(Function &&f, Args &&... args) -> decltype(f(std::forward<Args>(args)...))
{
return f(std::forward<Args>(args)...);
}

emplace_back 减少内存拷贝和移动

  emplace_back能就地通过参数构造对象,不需要拷贝或移动内存。

unordered container 无序容器

  C++11增加了无需容器unordered_map/unordered_multimap 和 unordered_set/unordered_multiset;由于这些容器中元素不是有序的,比map/multimap和set/multiset效率更高。map和set内部是红黑树,在插入元素时会自动排序,而无序容器内部是散列表(Hash Table),通过哈系,而不是排序来快速操作元素,使得效率更高

struct Key
{
std::string first;
std::string second;
}; struct KeyHash
{
std::size_t operator()(const Key& key)const
{
return std::hash<std::string>()(key.first) ^ (std::hash<std::string>()(key.second) << 1);
}
}; struct KeyEqual
{
bool operator()(const Key &lhs, const Key &rhs) const
{
return lhs.first == rhs.first && lhs.second == rhs.second;
}
}; std::unordered_map<Key,std::string,KeyHash,KeyEqual> munordermap = {
{{"first","first"},"1"},
{{"second","second"},"2"}
};

学习《深入应用c++11》2的更多相关文章

  1. Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer

    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...

  2. 学习Python编程的11个资源

    用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因 ...

  3. 学习Python编程的11个精品资源

    本文由 伯乐在线 - atupal 翻译自 Alex Ivanovs.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程 ...

  4. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)

    实验十四  Swing图形界面组件 理论部分: 不使用布局管理器 有时候可能不想使用任何布局管理器,而只 是想把组件放在一个固定的位置上.下面是将一 个组件定位到某个绝对定位的步骤: 1)将布局管理器 ...

  5. 学习激动人心的C++ 11

    1->创建7个Thread,跑个非常大的循环.观察CPU void func(string &name) { ;i<0xFFFFFFFF;i++) { //cout << ...

  6. java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧

    11. 6 调试技巧 1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试.这个方法可以保留,因为在java虚拟机只调用启动类的main方法. 2)   ...

  7. 201521123016 《Java学习笔记》 第11周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...

  8. 吴裕雄 python深度学习与实践(11)

    import numpy as np from matplotlib import pyplot as plt A = np.array([[5],[4]]) C = np.array([[4],[6 ...

  9. 《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?

    原创文章,欢迎转载.转载请注明:关东升的博客        在我们学习语言时都会学到这种语言的数据类型,在Swift中数据类型有那些呢?整型.浮点型.布尔型.字符.字符串这些类型是一定有的,其中集合. ...

  10. 学习动态性能表(11)v$latch$v$latch_children

    学习动态性能表 第十一篇-(1)-V$LATCH  2007.6.7 Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串 ...

随机推荐

  1. 第一个android App, hello world

    自以为按照教程很快就会创建自己第一个android App,没想到还是用了很长时间,中间走了很多坑,记下来,这也算自己的一个成长吧 首先按照官方的教程,新建一个工程 https://developer ...

  2. 【vue生命周期】- 详解

    这篇文章通俗易懂,写的不错,本文转载至:https://www.cnblogs.com/happ0/p/8075562.html 详解Vue Lifecycle 先来看看vue官网对vue生命周期的介 ...

  3. 在vscode中怎样debug调试go程序

    随着互联网时代的飞速发展,我们编码使用的开发利器也在不断更新换代,古话说工欲善其事必先利其器,对于Java开发者而言,eclipse和idea这两款神器各有千秋,因自己的爱好可以选取不同的IDE,但是 ...

  4. ADO.NET 的使用(一)

    一.ADO.NET概要 ADO.NET 是一组向 .NET Framework 程序员公开数据访问服务的类. ADO.NET 为创建分布式数据共享应用程序提供了一组丰富的组件. 它提供了对关系数据.X ...

  5. Nvue/Weex

    Nvue/Weex 使用Uniapp做了一个App,感觉性能不是很好,了解过Uniapp的Nvue,就想做一个纯Nvue项目,其实基本就是做一个Weex项目,不得不说坑是真的多,但是渲染性能真的是没得 ...

  6. 拜托,别再问我什么是 B+ 树了

    前言 每当我们执行某个 SQL 发现很慢时,都会下意识地反应是否加了索引,那么大家是否有想过加了索引为啥会使数据查找更快呢,索引的底层一般又是用什么结构存储的呢,相信大家看了标题已经有答案了,没错!B ...

  7. Leetcode_474. 一和零(二维01背包)

    每个字符串看成一个物品,两个属性是0和1的个数,转换为01背包. code class Solution { public: int w[605][2]; int dp[105][105]; int ...

  8. 教你如何利用threejs对3D模型皮肤进行DIY

    一步一步教你如何利用threejs加载gltf模型来实现DIY换肤功能. 模型准备 模型制作 模型可以通过网上下载,也可以自己通过c4d.maya.blender等模型制作软件得到.这里就不叙述有关模 ...

  9. Activiti入门案例

    一.流程定义 Activiti-Designer 使用 Palette(画板) 在eclipse 或 idea 中安装activiti-designer 插件即可使用,画板中包括以下结点: Conne ...

  10. 最新SCI影响因子发布!Nature屠榜,AI领域Top 1000期刊盘点

    [导读]2018年度SCI期刊影响因子最新发布,Nature.Science.Cell三大神刊排名前列.新智元摘取其中有关人工智能.机器学习.计算机视觉.机器人学等领域的期刊并做简要介绍,希望对读者选 ...