特殊,常用的几个
智能指针
string的数值转换函数-----链接
范围for()语句
用来逐一遍历string对象,容器,或者序列的每一个值,每循环一次,变量获取序列中的一个值。
string str("adbcdccd");
//遍历输出每一个字符
for(auto c:str)
cout<<c<<endl;
for(declaration:expression)
statement;
declaration是要定义的一个变量,expression是string对象或者,或者容器,或者序列。
右值引用
链接
完美转发--std::forward()
保持右值性质转发,防止产生拷贝。
lambda表达式
什么是lambda表达式
5=3+2
lambda表达式更准确的应该叫lambda函数。
就是特定的形式来完成函数功能的代码块。
链接1
默认生成const结构体
补充:
lambda参数列表不允许有默认参数
捕获列表的参数传递方式为---值传递。
#include<iostream>
using namespace std;
int main()
{
int a=9;
auto fun1=[=]{return a+1;};//你是你,我是我,如果是值传递捕获,被捕获变量和lambda表达式
auto fun2=[&]{return a+1;};//中的变量互不影响,只是值传递。
cout<<"fun1:"<<fun1()<<endl;
cout<<"fun2:"<<fun2()<<endl;
++a;
cout<<"++a执行之后的值"<<endl;
cout<<"fun1:"<<fun1()<<endl;
cout<<"fun2:"<<fun2()<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a=9;
auto fun1=[=]{return a+1;};
auto fun2=[&]{return ++a;};//区别
cout<<"fun1:"<<fun1()<<endl;
cout<<"fun2:"<<fun2()<<endl;
++a;
cout<<"++a执行之后的值"<<endl;
cout<<"fun1:"<<fun1()<<endl;
cout<<"fun2:"<<fun2()<<endl;
return 0;
}
注意区分捕获列表和参数列表
捕获列表中的数据,第一次调用lambda函数的时候进行初始化,就不变了。
lambda函数的返回对象和函数返回值
lambda函数是一个一定会返回函数指针的函数;
而lambda函数本身可以想普通函数一样指定一个返回值;
返回对象和返回值说不同的。
lambda表达式(函数)返回的是一个函数指针
而且注意:lambda表达式可写可不写,就算有返回值,也可以让编译器自动推导
int (*pf)(int a, int b) = nullptr;
pf = [](int a, int b) {
return a + b;
};
cout<<pf(10,20);
auto f=[]{....};
lambda函数之后要加分号
调用
lambda是函数,既然是函数,就不会自动调用。
int main()
{
auto f = [] {cout << "get" << endl; };
return 0;
}
//执行函数无输出
int main()
{
auto f = [] {cout << "get" << endl; };
f();//()是函数调用符
return 0;
}
//输出get
也可以定义的时候就执行----只需要在函数体之后加上函数调用符()
int m = 0;
int n = 0;
[&, n] (int a) mutable { m = ++n + a; }(4);
cout << m << endl << n << endl;
lambda函数作为函数参数
调用 一个函数的原理就是需要通过函数地址找到函数的位置,开始执行函数。
lambda函数作为函数参数返回一个函数指针(函数的调用地址),那么函数机会通过这个函数指针去调用lambda函数.
所以:lambda函数作为函数参数,会完成lmabda 函数的调用过程。
lambda表达式作为函数参数捕获指针问题
test1([this](std::weak_ptr<IObserver> observer){
auto action = new std::function<void()>([this,observer]{
std::shared_ptr<IObserver> shared_observer = observer.lock();
if(shared_observer) {
shared_observer->Connected(ip_);
}
});
});
lambda捕获的指针,可能会出现,还没有执行lambda函数,指针就被释放,或者指针崩溃的问题。
所以,lambda表达式除非保证指针在使用的范围内不会出现问题,否则当需要某些数据时,最好直接捕获(拷贝)数据,而不要通过捕获指针,从指针中获取值的方式。
什么是闭包
定义在函数内部的函数,用来连接内部和外部函数
闭包在c++中的实现就是lambda表达式,体现就是捕获列表。
decltype
参数为函数调用
编译器分析得到的类型为函数返回值;
decltype (vec.size()) i = 0;
i的类型为size()的返回类型--int