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 的主要改进包括:
- Lambda增强:泛型lambda和捕获表达式使lambda更灵活
- 类型推导扩展:函数返回类型推导简化代码
- constexpr增强:使更多函数能在编译期计算
- 实用工具:make_unique、shared_mutex等填补标准库空白
- 语法糖:二进制字面量、数字分隔符提高代码可读性
- 模板增强:变量模板提供新的元编程能力
虽然 C++14 的变化不如 C++11 重大,但这些改进显著提高了日常编码的便利性和表达力,使 C++ 更加现代化和实用。