c++14新特性
1、函数返回值类型推导
c++14对函数返回类型推导规则做了优化:
auto func(int i) { //C++11编译非法,c++14支持auto返回值类型推导
return i;
}
int main() {
cout << func(4) << endl;
return 0;
}
支持函数模块返回值类型推导:
template<typename T>
auto func(T t) { return t; } int main() {
cout << func(4) << endl;
cout << func(3.4) << endl;
return 0;
}
auto返回值用例:
// 编译失败,多个return语句必须返回相同类型。
auto func(bool flag) {
if (flag) return 1;
else return 2.3;
} // 编译失败,不能返回初始化列表
auto func1() {
return {1, 2, 3};
} //虚函数不能返回类型推导
class A{
virtual auto func() { return 1; }
}; //返回值类型推导可以提前前声明,但使用前必须进行函数定义。
auto f(); // declared, not yet defined
auto f() { return 42; } // defined, return type is int // 回类型推导可以用在递归函数中,但是递归调用必须以至少一个返回语句作为先导,以便编译器推导出返回类型。
auto sum(int i) {
if (i == 1)
return i; // return int
else
return sum(i - 1) + i; // ok
} int main() {
cout << f() << endl;
return 0;
}
2、lambda参数auto
在c++11中,lambda表达式参数需要使用具体的类型声明。
auto f = [] (int a) { return a; }
在c++14中,lambda表达式参数可以直接为auto。
auto f = [] (auto a) { return a; };
cout << f(1) << endl;
cout << f(2.3f) << endl;
3、变量模板
c++14支持变量模板。
template<class T>
constexpr T pi = T(3.1415926535897932385L); int main() {
cout << pi<int> << endl; // 3
cout << pi<double> << endl; // 3.14159
return 0;
}
4、别名模板
c++14支持别名模板。
template<typename T, typename U>
struct A {
T t;
U u;
}; template<typename T>
using B = A<T, int>; int main() {
B<double> b;
b.t = 10;
b.u = 20;
cout << b.t << endl;
cout << b.u << endl;
return 0;
}
5、constexpr的限制
1)c++14相较于c++11减少了限制:
c++11和c++14中constexpr函数均可以使用递归。
constexpr int factorial(int n) { // C++14 和 C++11均可
return n <= 1 ? 1 : (n * factorial(n - 1));
}
c++14还可以使用局部变量和循环。
constexpr int factorial(int n) { // C++11中不可,C++14中可以
int ret = 0;
for (int i = 0; i < n; ++i) {
ret += i;
}
return ret;
}
c++11中constexpr函数中必须把所有东西放在一个单独的return语句中。
constexpr int func(bool flag) { // C++14 和 C++11均可
return 0;
}
c++14中constexpr函数没有上述限制。
constexpr int func(bool flag) { // C++11中不可,C++14中可以
if (flag) return 1;
else return 0;
}
6、[[deprecated]]标记
c++14中增加deprecated标记,修饰类、变量、函数等。编译时产生警告,提醒用户该标记修饰的内容未来可能会被丢弃。
struct [[deprecated]] A { }; int main() {
A a;
return 0;
}
7、二进制字面量与字面量分隔符
c++14引入了二进制字面量和字面量分隔符。
int a = 0b0001'0011'1010;
double b = 3.14'1234'1234'1234;
8、std::make_unique
c++11中有std::make_shared,c++14增加了std::make_unique。
struct A {};
std::unique_ptr<A> ptr = std::make_unique<A>();
9、std::shared_timed_mutex与std::shared_lock
c++14通过std::shared_timed_mutex和std::shared_lock来实现读写锁,保证多个线程可以同时读,但是写线程必须独立运行,写操作和读操作不可同时进行,这种情况下才能从shared_mutex中获取性能优势。
c++11 中互斥量
互斥量 | 说明 |
std::mutex | 独占的互斥量,不能递归使用 |
std::timed_mutex | 有超时能力的独占互斥量,不能递归使用 |
std::recursive_mutex | 递归互斥量 |
std::recursive_timed_mutex | 有超时能力的递归互斥量 |
c++14互斥量管理类-锁
- shared_lock是read lock。搭配std::shared_mutex使用,被锁定后允许其它线程执行同样被shared_lock的代码。
- lock_gurd和unique_lock是write lock。被锁定后,不允许其它线程执行被share_lock或unique_lock的代码。
通常这样定义:
typedef std::shared_lock<std::shared_mutex> ReadLock;
typedef std::lock_guard<std::shared_mutex> WriteLock;
实现方式:
struct ThreadSafe {
mutable std::shared_timed_mutex mutex_;
int value_; ThreadSafe() {
value_ = 0;
} int get() const {
std::shared_lock<std::shared_timed_mutex> lock(mutex_);
return value_;
} void increase() {
std::unique_lock<std::shared_timed_mutex> lock(mutex_);
value_ += 1;
}
};
10、 std::integer_sequence
表示一个编译时的整型序列。
11、std::exchange
以 new_value
替换 obj
的值,并返回 obj
的旧值。注意与std::swap的区别。
vector<int> v{4,5,6,7};
vector<int> x = std::exchange(v, {1,2,3,4});
cout << v.size() << endl;
for (int a : v) {
cout << a << " ";
}
cout<<endl;
for (int a : x) {
cout << a << " ";
}
12、std::quoted
c++14引入std::quoted用于给字符串添加双引号。
string str = "hello world";
cout << str << endl;
cout << std::quoted(str) << endl;
/* 输出
* hello world
* "hello world"
*/
c++14新特性的更多相关文章
- C++ 14 新特性总结
转载自: http://www.codeceo.com/article/cpp-14-new-features.html C++14 这一继C++11 之后的新的 C++ 标准已经被正式批准,正在向 ...
- Java 15 正式发布, 14 个新特性,刷新你的认知!!
JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...
- Java程序员必备基础:JDK 5-15都有哪些经典新特性
前言 JDK 15发布啦~ 我们一起回顾JDK 5-15 的新特性吧,大家一起学习哈~ 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 「公众 ...
- Java9至17的新特性总结
总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...
- Java 17 新特性:switch的模式匹配(Preview)
还记得Java 16中的instanceof增强吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); da ...
- atitit.eclipse 新特性总结3.1--4.3
atitit.eclipse 新特性总结3.1--4.3 Eclipse 3.1 1 Eclipse 3.2 Java开发工具的新特性 2 1. 内容辅助(Ctrl+Space)模板 2 2. 动态地 ...
- 转:关于C++14:你需要知道的新特性
关于C++14:你需要知道的新特性 遇见C++ Lambda C++14 lambda 教程 C++11 lambda表达式 C++标准库:使用 std::for_each std::generate ...
- C++11 & C++14 & C++17新特性
C++11:C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. 新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导 ...
- Atitit eclipse新特性总结3.1---4.4 4.5
Atititeclipse新特性总结3.1---4.4 4.5 1. Eclipse 4.4 Luna正式发布了.1 1.1. 新版本的Eclipse默认对Java8提供支持1 1.2. 内存分析器 ...
随机推荐
- 【LeetCode】703. Kth Largest Element in a Stream 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...
- DFT, DHT, DCT, DST
目录 基本 酉变换 others Fourier-related Transforms DFT DHT DCT 与DFT的联系 DST 与DFT的联系 Gonzalez R. C. and Woods ...
- CapstoneCS5265设计替代CH7211 |Type-C转HDMI2.0方案|替代CH7211
龙迅Chrontel的CH7211是一款Type-C转HDMI2.0半导体设备,可通过USB Type-C连接器将DisplayPort信号转换为HDMI/DVI.这款创新的基于USB Type-C的 ...
- MySQL数据操作与查询笔记 • 【第2章 表结构管理】
全部章节 >>>> 本章目录 2.1 关系模型与数据表 2.1.1 关系模型 2.1.2 数据表 2.2 MySQL 数据类型 2.2.1 MySQL 常见数据类型 2.2 ...
- 编写Java程序,创建Dota游戏中的兵营类,兵营类有一个类成员变量count、一个实例变量name和另一个实例变量selfCount。
返回本章节 返回作业目录 需求说明: 创建Dota游戏中的兵营类 兵营类有一个类成员变量count.一个实例变量name和另一个实例变量selfCount. count表示的是兵营已经创建士兵的总数: ...
- Asp.Net Core 使用Monaco Editor 实现代码编辑器
在项目中经常有代码在线编辑的需求,比如修改基于Xml的配置文件,编辑Json格式的测试数据等.我们可以使用微软开源的在线代码编辑器Monaco Editor实现这些功能.Monaco Editor是著 ...
- SpringCloud发现服务代码(EurekaClient,DiscoveryClient)
1.说明 本文介绍SpringCloud发现服务代码的开发, 通过使用EurekaClient,DiscoveryClient来发现注册中心的服务等, 从而可以自定义客户端对注册中心的高级用法. 2. ...
- [数据结构]FHQ-Treap
前言(个人评价FHQ-Treap) 这是一个巨佬(名叫范浩强)在冬令营交流的时候提出的数据结构(FHQ:\(\text{你干嘛非要旋转呢?Think Functional!}\))(可以看出FHQ大佬 ...
- 分享一篇:sql语句中使用子查询,可能会引起查询的性能问题,查询时间会变长
前段时间,做自动化适配的时候,查找需要的数据的时候,使用到了dblink,跨数据库实例进行访问,整段sql拼接再加上dblink,在plsql查询的时候,性能还不是很长时间,最多2分钟可以查到,前期调 ...
- Java的jar包构建成docker镜像并运行
结构如下 把jar和Dockerfile放到一个文件,不在一个文件下会报错文件找不到 创建一个构建文件 buildimage.sh vi /home/hanby/buildimage.sh echo ...