目录:
编译期constexpr if语句/constexpr的lambda表达式:
前言
本篇博客分享,对于c++11,14,17的常用c++新版本特性~
C++11的常用新特性
auto类型推导:
C++赋予auto关键字新的含义,用它做于自动类型推导
使用了auto关键字后,编译器会在编译阶段自动推导出变量的类型
基本使用语法:
auto name = value;
name是变量名字,value是变量的初始值
注意:auto只是一个占位符,在编译期间会被真正的类型所替代,并不违背C++中的变量名必须有明确类型这一规定,只是这个是编译器自动给你推导的
auto的限制:
- auto 不能在函数的参数中使用(auto 要求必须对变量进行初始化)
- auto 不能作用于类的非静态成员变量(也就是没有 static 关键字修饰的成员变量)中
- auto 关键字不能定义数组
- auto 不能作用于模板参数
auto的应用:
范围for:
int main()
{
std::vector<int> vi{ 3,5,1,6,7,2,8 };
for (auto e : vi) {
std::cout << e << " ";
}
return 0;
}
//输出结果:3 5 1 6 7 2 8
以及泛型编程中~
decltype类型推导:
auto 和 decltype 关键字都可以自动推导出变量的类型,但它们的用法是有区别的:
auto name = value;
decltype(exp) name = value;
其中name便是变量名,value表示赋给变量的初值~~
auto 根据 = 右边的初始值value推导出变量的类型
decltype根据圆括号内的exp表达式推出变量类型,和 = 右边的value无关
TIP:auto变量一定要初始化,decltype不用,很好理解,auto推导他需要初始化才推得动
decltype的实际应用:
下面就是使用的decltype推导的类型,避免使用T::iterator获得容器迭代器指针,因为有些自己实现的容器并没有iterator
使用using 定义别名:
C++11中的using 写法跟typedef 等价
template<typename V>
using smap = std::map<std::string, V>;
void test_using()
{
smap<int> mp1;
mp1["score"] = 100;
mp1["age"] = 18;
smap<string> mp2;
mp2["name"] = "Merge";
mp2["address"] = "CN";
std::cout << mp1["age"] << ": " << mp1["score"] << endl;
std::cout << mp2["name"] << ": " << mp2["address"] << endl;
}
// 输出:
// 18: 100
// Merge: CN
支持函数模板的默认模板参数 :
C++11 支持为函数模板中的参数设置默认值,在实际使用过程中,我们可以选择使用默认值,也可以尝试由编译器自行推导得到,还可以亲自指定各个模板参数的类型
template <typename R = int, typename T, typename U>
R func(T v1,U v2)
{
return v1+v2;
}
void testFunTemplate()
{
auto r1=func(5.5,10);
auto r2=func<double>(5.5,10);
auto r3=func<double, int, int>(5.5,10);
cout<<"r1:"<<r1<<endl;
cout<<"r2:"<<r2<<endl;
cout<<"r3:"<<r3<<endl;
}
tuple元组:
tuple的最大特点是:实例化的对象可以存储任意数量、任意类型的数据
例如要储存多个不同类型的元素时;需要函数返回多个数据的时,可以存储在tuple中后返回
void tuple_test()
{
std::tuple<int, char> fir;
std::tuple<int, char> mid(std::make_pair(2, '2')); //{2,'2'}
std::tuple<int, char> sec(1, '1'); //右值初始化
std::tuple<int, int, char> thd(make_tuple(6, 6, '6')); //右值初始化
std::tuple<int, char> fourth(sec); //左值初始化
std::cout << std::get<0>(fourth) << " : " << std::get<1>(fourth) << std::endl;
std::cout << std::get<0>(thd) << " : " << std::get<1>(thd) << " : " << std::get<2>(thd) << std::endl;
}
//输出:
//1 : 1
//6 : 6 : 6
列表初始化:
在 C++11 中,初始化列表的适用性被大大增加了。它现在可以用于任何类型对象的初始化
class Base
{
public:
Base(int){}
};
int main()
{
Base b1(123);
Base b2 = 123;
Base b3 = { 123 };
Base b4{ 123 };//c++11加入
return 0;
}
//上述这些都是可以给定义的对象赋初值的
lambda匿名函数:
C++11中引入了lambda~~
定义一个lambda匿名函数:
[](){}
这就是lambda的表达式三个括号,省略返回值
[外部访问方式说明