&&

  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. 【转】sublime text 2 快捷键大全

    Ctrl+L 选择整行(按住-继续选择下行) Ctrl+KK 从光标处删除至行尾 Ctrl+Shift+K 删除整行 Ctrl+Shift+D 复制光标所在整行,插入在该行之前 Ctrl+J 合并行( ...

  2. SpringBoot2 线程池的定义和使用

    SpringBoot2 线程池的定义和使用 定义线程池 @Slf4j @EnableAsync @Configuration public class AsyncExecutorConfig impl ...

  3. Python-列表做的购物车小程序

    一.流程为,输入你有多少钱,然后循环购买商品,输入‘q’ 退出程序 goods=[['苹果',6500],['华为',4999],['小米',2999],['oppo',3599]] #初始化列表,填 ...

  4. Django HttpResponse

    HttpResponse 概述:给浏览器返回数据 HttpRequest对象是由django创建的,HttpResponse对象由程序员创建 用法 1:不调用模板,直接返回数据. 例: def get ...

  5. 刷oj之类的题时java Scanner读取太慢解决之道

    1.转载自一个 https://www.cpe.ku.ac.th/~jim/java-io.html 2.工具代码 class Reader { static BufferedReader reade ...

  6. css网页重置样式表(多版本)

    Eric reset.css html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...

  7. UNIX环境高级编程——TCP/IP网络编程 常用网络信息检索函数

    UNIX环境高级编程——TCP/IP网络编程   常用网络信息检索函数 gethostname()   getppername()   getsockname()   gethostbyname() ...

  8. JSOI 2016 病毒感染 辅助Dp问题

    原题链接:https://www.luogu.com.cn/problem/P5774 分析 直接看这道题,第一个困惑点,那个绝对值的比较是什么东西,根据数学知识,我们可以知道这个意思是k到i的距离小 ...

  9. Transformers 词汇表 | 二

    作者|huggingface 编译|VK 来源|Github 词汇表每种模型都不同,但与其他模型相似.因此,大多数模型使用相同的输入,此处将在用法示例中进行详细说明. 输入ID 输入id通常是传递给模 ...

  10. 两行代码统计模型参数量与FLOPs,这个PyTorch小工具值得一试

    你的模型到底有多少参数,每秒的浮点运算到底有多少,这些你都知道吗?近日,GitHub 开源了一个小工具,它可以统计 PyTorch 模型的参数量与每秒浮点运算数(FLOPs).有了这两种信息,模型大小 ...