C++14 新特性详解:相较于 C++11 的主要改进

C++14 新特性详解:相较于 C++11 的主要改进

C++14 是 C++11 之后的一个小版本更新,主要目标是完善 C++11 引入的特性并解决一些实际问题。以下是 C++14 相较于 C++11 的主要变化:

一、语言核心特性

1. 泛型 Lambda 表达式

cpp 复制代码
auto lambda = [](auto x, auto y) {  // 参数类型自动推导
    return x + y;
};

int i = lambda(3, 4);      // int 版本
double d = lambda(3.1, 4.2); // double 版本

2. Lambda 捕获表达式

cpp 复制代码
int x = 4;
auto y = [&r = x, x = x + 1]() {  // 捕获时初始化新变量
    r += 2;      // 修改外部x
    return x + 1; // 使用局部x
}();
// 执行后: x == 6, y == 6

3. 函数返回类型推导

cpp 复制代码
auto sum(int a, int b) {  // 自动推导返回类型
    return a + b;
}

auto factorial(int n) {   // 递归函数也支持
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

4. 放宽的 constexpr 限制

cpp 复制代码
constexpr int factorial(int n) {  // C++14允许循环和局部变量
    int result = 1;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}

constexpr int f = factorial(5);  // 编译时计算

5. 二进制字面量

cpp 复制代码
int mask = 0b11010110;  // 二进制表示

6. 数字分隔符

cpp 复制代码
long long big_num = 1'000'000'000;  // 提高可读性
double pi = 3.141'592'653'59;

7. 变量模板

cpp 复制代码
template<typename T>
constexpr T pi = T(3.1415926535897932385);

float f = pi<float>;
double d = pi<double>;

二、标准库增强

1. std::make_unique

cpp 复制代码
#include <memory>

auto ptr = std::make_unique<int>(42);  // 类似std::make_shared

2. 共享的互斥体和锁

cpp 复制代码
#include <shared_mutex>

std::shared_mutex mutex;

// 读取时使用共享锁
{
    std::shared_lock lock(mutex);  // 多个线程可同时获取
    // 读操作...
}

// 写入时使用独占锁
{
    std::unique_lock lock(mutex);  // 独占访问
    // 写操作...
}

3. 标准库类型别名

cpp 复制代码
std::string::size_type len;  // 原来写法
std::string::size_type len;  // C++14可用更简洁的别名

4. 编译时整数序列

cpp 复制代码
#include <utility>

template<int... Is>
void print_sequence(std::integer_sequence<int, Is...>) {
    ((std::cout << Is << ' '), ...);  // 打印序列
}

print_sequence(std::make_integer_sequence<int, 5>{});  // 输出: 0 1 2 3 4

5. std::exchange

cpp 复制代码
#include <utility>

std::vector<int> v = {1, 2, 3};
auto old = std::exchange(v, {4, 5, 6});  // 替换v并返回旧值
// v现在是{4,5,6}, old是{1,2,3}

6. 关联容器的异构查找

cpp 复制代码
std::set<std::string> s = {"hello", "world"};
auto it = s.find("hello");  // 原来需要构造临时string
auto it = s.find("hello"sv);  // C++14支持string_view查找

三、其他改进

1. 弃用 auto_ptr

cpp 复制代码
// C++14明确弃用auto_ptr,应使用unique_ptr
std::auto_ptr<int> p;  // 编译警告

2. 大小可分配的释放函数

cpp 复制代码
void operator delete(void* ptr, std::size_t size) noexcept;
void operator delete[](void* ptr, std::size_t size) noexcept;

3. [[deprecated]] 属性

cpp 复制代码
[[deprecated("Use new_func() instead")]]
void old_func();

四、总结

C++14 的主要改进包括:

  1. Lambda增强:泛型lambda和捕获表达式使lambda更灵活
  2. 类型推导扩展:函数返回类型推导简化代码
  3. constexpr增强:使更多函数能在编译期计算
  4. 实用工具:make_unique、shared_mutex等填补标准库空白
  5. 语法糖:二进制字面量、数字分隔符提高代码可读性
  6. 模板增强:变量模板提供新的元编程能力

虽然 C++14 的变化不如 C++11 重大,但这些改进显著提高了日常编码的便利性和表达力,使 C++ 更加现代化和实用。

相关推荐
linksinke1 小时前
Mapstruct引发的 Caused by: java.lang.NumberFormatException: For input string: ““
java·开发语言·exception·mapstruct·numberformat·不能为空
无限进步_1 小时前
C语言单向链表实现详解:从基础操作到完整测试
c语言·开发语言·数据结构·c++·算法·链表·visual studio
初夏睡觉1 小时前
循环比赛日程表 题解
数据结构·c++·算法
好好研究1 小时前
SpringMVC框架 - 异常处理
java·开发语言·spring·mvc
songroom2 小时前
Rust: 量化策略回测与简易线程池构建(MPMC)
开发语言·后端·rust
CS_浮鱼2 小时前
【Linux编程】线程同步与互斥
linux·网络·c++
摇滚侠2 小时前
Vue 项目实战《尚医通》,完成确定挂号业务,笔记46
java·开发语言·javascript·vue.js·笔记
十五年专注C++开发2 小时前
libdatrie: 一个高效的 基于双数组字典树(Double-Array Trie)的C语言函数库
c语言·开发语言·trie
程序猿_极客3 小时前
【2025最新】 Java入门到实战:包装类、字符串转换、equals/toString + 可变字符串,一篇搞定开发高频场景(含案例解析)
java·开发语言·java进阶·面试核心·java快速入门