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]]
属性