当前位置: 首页 > news >正文

C++14 新增的特性

C++14 是 C++11 的小幅改进版本,主要以增强 C++11 的特性、修复缺陷和提供更好的开发体验为目标。以下是 C++14 的主要更新内容:


1. 泛型 Lambda (Generic Lambda)

C++11 中 Lambda 需要显式指定参数类型,而 C++14 允许使用 auto 作为 Lambda 形参类型,使其更加泛型化。

auto lambda = [](auto x, auto y) { return x + y; };
std::cout << lambda(3, 4) << "\n";     // 7
std::cout << lambda(3.5, 4.2) << "\n"; // 7.7

2. Lambda 表达式支持 return 类型推导

C++11 需要 -> 指定返回类型,C++14 允许省略 ->,编译器自动推导。

auto lambda = [](int x) { return x * 2; };  // 返回类型自动推导为 int

3. std::make_unique<T>()

C++14 引入 std::make_unique<T>() 来创建 std::unique_ptr,类似于 C++11 中的 std::make_shared<T>()

#include <memory>

auto ptr = std::make_unique<int>(42);

优势:

  • 避免手动使用 new
  • 防止内存泄漏
  • 提高代码可读性

4. 变量模板 (Variable Templates)

C++14 允许为模板定义变量,而不仅仅是函数或类。

template<typename T>
constexpr T pi = T(3.1415926535897932385);

std::cout << pi<double> << "\n";  // 3.141592653589793
std::cout << pi<float> << "\n";   // 3.14159

5. 二进制字面量

C++14 允许直接使用 0b 表示二进制字面量,增强代码可读性。

int binary = 0b1101; // 13

6. 数字分隔符 (' 号)

为了提高可读性,C++14 允许在数字字面量中使用 ' 作为分隔符。

int largeNumber = 1'000'000;  // 1000000
int binary = 0b1010'1011;    // 171

7. decltype(auto) 关键字

C++14 引入 decltype(auto),可以保留返回值的引用特性,而普通 auto 会丢失引用信息。

int x = 10;
int& foo() { return x; }

decltype(auto) y = foo();  // y 为 int&,而 auto y = foo(); 则 y 为 int

8. std::integer_sequence

C++14 提供 std::integer_sequence,用于编译期处理整数序列(常用于模板元编程)。

#include <iostream>
#include <utility>

template<std::size_t... Indices>
void print_indices(std::index_sequence<Indices...>) {
    ((std::cout << Indices << " "), ...);
}

int main() {
    print_indices(std::make_index_sequence<5>{});  // 输出: 0 1 2 3 4
}

9. constexpr 关键字增强

C++11 的 constexpr 只能用于简单的表达式,而 C++14 允许 constexpr 函数包含更复杂的逻辑,如循环和 if 语句。

constexpr int factorial(int n) {
    int result = 1;
    for (int i = 2; i <= n; ++i) {
        result *= i;
    }
    return result;
}

static_assert(factorial(5) == 120, "Error");

10. std::exchange

C++14 提供 std::exchange(),用于交换值并返回旧值,适用于重置变量并获取旧值。

#include <utility>
#include <iostream>

int main() {
    int x = 5;
    int old_x = std::exchange(x, 10);
    std::cout << "Old: " << old_x << ", New: " << x << "\n"; // 输出: Old: 5, New: 10
}

11. std::quoted

C++14 在 <iomanip> 头文件中提供 std::quoted,用于格式化字符串,加上引号并处理特殊字符。

#include <iostream>
#include <iomanip>
#include <sstream>

int main() {
    std::string s = "Hello, world!";
    std::cout << std::quoted(s) << "\n";  // 输出: "Hello, world!"
}

12. [[deprecated]] 属性

C++14 允许使用 [[deprecated]] 标注不推荐使用的函数或变量,编译时会警告。

[[deprecated("Use new_function instead")]]
void old_function() {}

int main() {
    old_function();  // 警告: ‘old_function’ is deprecated: Use new_function instead
}

总结

C++14 主要是对 C++11 的增强和优化,新增的特性使代码更加简洁和高效。核心改进包括:

  • 泛型 Lambda (auto 形参)
  • std::make_unique<T>()
  • constexpr 增强
  • decltype(auto)
  • std::integer_sequence
  • std::exchange
  • [[deprecated]] 属性

相关文章:

  • 深入解析 Java GC 调优:减少 Minor GC 频率,优化系统吞吐
  • 数据结构篇:空间复杂度和时间复杂度
  • HarmonyOS NEXT开发实战——TypeScript快速入门与ArkTS介绍
  • go中的文件、目录的操作
  • 编程题记录3
  • 算法训练营第二十三天 | 贪心算法(一)
  • x-cmd install | Wuzz - Web 开发与安全测试利器,交互式 HTTP 工具
  • 《尘埃落定》读后感
  • Power BI嵌入应用:常见问题与调试技巧
  • endnote相关资料记录
  • Visual Studio Code 无法打开源文件解决方法
  • Java Spring Cloud应用全栈性能优化指南
  • 【jvm】垃圾回收的并行和并发
  • 内核编程九:进程概述
  • Buffer overFolw---Kryo序列化出现缓冲区溢出的问题解决
  • Spring Cache 实战指南
  • 华为机试牛客刷题之HJ58 输入n个整数,输出其中最小的k个
  • 掌握 Postman:高级 GET 请求技术与响应分析
  • Ubuntu22.04美化MacOS主题
  • 什么是正文化
  • 四川甘孜州白玉县发生4.9级地震,震源深度10千米
  • 泰山景区管委会:未经审核同意不得擅自举办竞速类登山活动
  • 初中女生遭多人侵犯后,家属奔波三年要追责那个“案外”的生物学父亲
  • 被电诈100万元又要被骗71万元,女子经民警近8小时劝阻幡然醒悟
  • 研究显示:日行9000步最高可将癌症风险降低26%
  • 职工疗休养如何告别千篇一律?安徽含山给出新解法