笔记来源:
类型推导
auto
让编译器在编译期就推导出变量的类型,可以通过=右边的类型推导出变量的类型。
auto test=10;
cout<<typeid(test).name()<<endl;// int
decltype
decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算
int x = 0;
decltype(x) y;// 分析x的类型,并构建变量y
decltype(x + y) z;// 分析x+y的类型,并构建变量z
cout<<typeid(z).name()<<endl;// int
int func() { return 0; }
decltype(func) f;// 分析func方法返回的类型,并构建变量f
cout<<typeid(f).name()<<endl;// int
左值右值
- 左值:可以取地址并且有名字的东西就是左值。
- 右值:不能取地址的没有名字的东西就是右值。
例如:
int a; a=0;
这里面a就是左值,0是右值。
- 纯右值:运算表达式产生的临时变量、不和对象关联的原始字面量、非引用返回的临时变量、lambda表达式等。
- 将亡值:可以理解为即将要销毁的值。
- 左值引用:对左值进行引用的类型。
- 右值引用:对右值进行引用的类型。
- 移动语义:转移资源所有权,类似于转让或者资源窃取的意思,对于那块资源,转为自己所拥有,别人不再拥有也不会再使用。
- 完美转发:可以写一个接受任意实参的函数模板,并转发到其它函数,目标函数会收到与转发函数完全相同的实参。
- 返回值优化:当函数需要返回一个对象实例时候,就会创建一个临时对象并通过复制构造函数将目标对象复制到临时对象,这里有复制构造函数和析构函数会被多余的调用到,有代价,而通过返回值优化,C++标准允许省略调用这些复制构造函数。
列表初始化
在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化
int num(50);
std::cout<<num<<std::endl;//50
int list[5]={0,1,2,3,4};
for(int i=0;i<5;i++)
std::cout<<list[i];//01234
std::function
std::function是一个函数包装器,
该函数包装器模板能包装任何类型的可调用实体,
如普通函数,函数对象,lamda表达式等。包装器可拷贝,移动等,
并且包装器类型仅仅依赖于调用特征,而不依赖于可调用元素自身的类型。
std::function是C++11的新特性,包含在头文件<functional>
中。
就是C语言中的函数指针
#include <iostream>
#include <functional>
using namespace std;
void print()
{
cout<<"hello"<<endl;
}
int main()
{
std::function<void()> func(&print);
func();// hello
return 0;
}
std::bind
bind这个方法有点抽象,
std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作。
————————————————
版权声明:本文为CSDN博主「___Blue_H」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37653144/article/details/79285221
例如
#include <iostream>
#include <typeinfo>
#include <functional>
using namespace std;
void mprint(const char * str,const char * str2)
{
cout<<str<<str2<<endl;
}
int main()
{
auto func = std::bind(mprint, "hello",std::placeholders::_1);
func(" world");//hello world
return 0;
}
本来需要两个参数的mprint方法,变成了只需要1个参数。
std::placeholders::_1
是占位符,用于表示第一个参数。