C++14 新特性
目录
C++14 是 C++11 的小版本更新,主要是完善和补充,核心特性不多但很实用。
1 一、函数返回值类型推导
C++11 只有 lambda 可以用 auto 推导返回值,C++14 扩展到所有函数:
| |
注意:
- 递归函数不能用 auto 返回值推导(除非先有前置声明)
- 有多个 return 语句时,所有 return 的类型必须相同
2 二、泛型 lambda(Generic Lambda)
C++11 的 lambda 参数必须写具体类型,C++14 可以用 auto:
| |
本质: 编译器自动生成一个模板函数对象。
3 三、变量模板(Variable Templates)
之前只有类模板、函数模板,C++14 新增变量模板:
| |
最经典的应用:std::is_same_v<T, U> 就是 C++17 基于变量模板做的。
4 四、聚合初始化增强
C++14 允许聚合体中含有默认成员初始化器时,仍然可以用花括号初始化:
| |
5 五、decltype(auto)
解决转发函数的返回值问题:
| |
区别:
auto:会去掉引用和顶层 constdecltype(auto):完美保留表达式的原始类型
| |
6 六、标准库新增
6.1 6.1 std::make_unique
C++11 有 make_shared 但漏掉了 make_unique,C++14 补上:
| |
6.2 6.2 std::shared_timed_mutex
读写锁的超时版本,C++17 又加了 shared_mutex。
6.3 6.3 整数序列 std::integer_sequence
模板元编程工具,用于展开参数包:
| |
日常开发用得少,库作者用得多。
6.4 6.4 std::exchange
赋值并返回旧值:
| |
7 七、其他小特性
| 特性 | 说明 |
|---|---|
| 二进制字面量 | 0b1010 表示十进制 10 |
| 数字分隔符 | 1'000'000 可读性更好 |
| lambda 初始化捕获 | C++14 可以在捕获列表里初始化新变量 |
| |
8 总结
C++14 是一个过渡版本,特性不多但都很实用:
- 函数返回值 auto:写起来更简洁
- 泛型 lambda:配合 auto 参数,写算法更方便
- decltype(auto):完美转发返回值
- make_unique:终于补上了
- 变量模板:为后续标准库简化铺路