c++14新语言功能特性学习记录
1.变量模板
变量模板定义一族变量或静态数据成员。在c++14之前只有函数模板和类模板,c++14提供了变量模板:
template<class T>
constexpr T pi = T(3.1415926535897932385L); //变量模板
template<class T>
T circular_area(T r)//
{
return pi<T> * r *r; //pi<T>是变量模板实例化
}
int main()
{
cout << "C++ 标准版本:" << __cplusplus << endl;
double a = 5;
float b = 5;
cout << circular_area(a) << endl;
cout << circular_area(5) << endl;
cout << circular_area(b) << endl;
cout << circular_area<double>(5) << endl;
cout << circular_area<float>(5) << endl;
cout << circular_area<int>(5) << endl;
return 0;
}
运行结果:
2.泛型 lambda
在c++11中,lambda表达式的形参需要被声明为具体的类型。而在c++14中放宽了这一要求,这就可以使用类型说明符auto作为表达式的形参声明,从而达到泛型lambda的目的。
int main()
{
cout << "C++ 标准版本:" << __cplusplus << endl;
auto lambda_int = [](int x, int y) {return x + y;}; //c++11
cout << lambda_int(2, 5) << endl;
auto lambda_float = [](float x, float y) {return x + y;}; //c++11
cout << lambda_float(2.3, 5.9) << endl;
auto lambda = [](auto x, auto y) {return x + y;}; //c++14
cout << lambda(1.5, 5) << endl;
cout << lambda(2, 5) << endl;
cout << lambda(3, 5.5) << endl;
return 0;
}
3.lambda 初始化捕获
C++11的 lambda 表达式通过值拷贝和引用来捕获在外层作用域声明的变量。这就意味着 lambda 的值成员不可以是 move-only 类型,而在C++14中,lambda 表达式放开限制,允许对被捕获的成员用任意的表达式初始化。这样放开限制的第一个好处就是可以通过 std::move 来初始化捕获一个 move-only 类型的变量,如下例
int main()
{
cout << "C++ 标准版本:" << __cplusplus << endl;
int d = 20;
auto lambda1 = [d = move(d)](auto x) {return d + x;};
cout << lambda1(10) << endl;
cout << lambda1(5) << endl;
auto lambda2 = [d = 10](auto x, auto y = 10) {return d + x + y;};
cout << lambda2(10, 5) << endl;
cout << lambda2(5, 6) << endl;
cout << lambda2(5, 3) << endl;
cout << "Hello World!" << endl;
return 0;
}
4.new/delete 消除
这个不知道为什么说是c++14的特性,c++各标准都有new、delete操作功能。
5. constexpr 函数上放松的限制
6.二进制字面量
7.数位分隔符
8.函数的返回类型推导
9.带默认成员初始化器的聚合类。
参考:
https://zh.cppreference.com/w/cpp/14
https://github.com/makelinux/examples/blob/main/cpp/14.cpp
https://blog.csdn.net/qq_45698148/article/details/121801662