C++14/17/20新特性总结
C++14
- std::make_unique
// 旧方式 (不安全) // std::unique_ptr<Foo> p(new Foo()); // C++14 方式 (安全、简洁) auto p = std::make_unique<Foo>(); - auto
函数返回值类型推导
auto add(int a, int b) { return a + b; }auto支持Lambda表达式
auto generic_add = [](auto x, auto y) { return x + y; }; - 二进制字面量
int mask = 0b11010010; - 数字分隔符
long long large_number = 1'000'000'000; int binary_val = 0b1101'0010'1001'0110; - deprecated属性
[[deprecated("Use new_function() instead")]] void old_function() { // ... } - std::shared_lock 通过std::shared_timed_mutex和std::shared_lock来实现读写锁,保证多个线程可以同时读
C++17
- std::optional, std::variant, std::any
- std::optional
: 表示一个可能包含也可能不包含 T 类型值的对象。解决了使用特殊值(如 nullptr 或 -1)来表示“无值”状态的问题。 - std::variant<T, U, …>: 一个类型安全的联合体(union)。在任何时候,它都只持有其模板参数类型之一的值。
- std::any: 可以持有任何可拷贝类型的值。
- std::optional
- string_view:一个轻量级的字符串引用。它指向一个已存在的字符序列(如 std::string 或 C 风格字符串),但本身不分配内存。
void print_string(std::string_view sv) { std::cout << sv << std::endl; } std::string s = "A long long string"; print_string(s); // 无拷贝 print_string("A C-style literal"); // 无拷贝 - 结构化绑定
for (const auto& [key, value] : my_map) { std::cout << key << ": " << value << std::endl; } auto [id, score, name] = get_tuple_data(); - if语句中初始化
if (auto it = my_map.find(1); it != my_map.end()) { std::cout << "Found: " << it->second << std::endl; } // it在这里销毁 - 类模板参数自动推导
std::lock_guard<std::mutx> lock(mtx); // C++17之前 std::lock_guard lock(mtx); // C++17自动推导 - constexpr
constexpr Lambda表达式
constexpr auto square = [](int n) { return n * n; }; static_assert(square(5) == 25);constexpr if表达式
template <typename T> auto get_value(T t) { if constexpr (std::is_pointer_v<T>) { return *t; } else { return t; } } - filesystem: 提供了一套标准的、跨平台的API来操作文件和目录。
- 并行算法
std::vector<int> v = { /* ... 大量数据 ... */ }; // 使用并行策略 std::sort(std::execution::par, v.begin(), v.end()); - namespace嵌套
namespace A { namespace B { namespace C { void func(); } } } - __has_include预处理表达式
- 新增attribute
- [[nodiscard]] :表示修饰的内容不能被忽略,可用于修饰函数,标明返回值一定要被处理
- [[maybe_unused]] :提示编译器修饰的内容可能暂时没有使用,避免产生警告
C++20
- 协程
- 模块
- 并发
- jthread
- 信号量
- barrier
- latch
- std::atomic的等待和通知
- std::atomic_ref
- 概念库
concpet是对模板参数的约束,它允许你指定模板参数必须满足哪些要求
// 定义一个概念,要求类型T可被相加并返回T类型 template<typename T> concept Addable = requires(T a, T b) { { a + b } -> std::same_as<T>; }; // 使用概念约束模板参数 template<Addable T> T sum(T a, T b) { return a + b; } int main() { sum(1, 2); // OK sum("a", "b"); // 编译错误,错误信息清晰指出 const char* 不满足 Addable } - 范围库
int main() { std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8}; // 找出所有偶数,将它们平方,然后打印 auto even_squares = numbers | std::views::filter([](int n){ return n % 2 == 0; }) | std::views::transform([](int n){ return n * n; }); // 计算在这里才真正发生 for (int n : even_squares) { std::cout << n << " "; } } -
格式化库std::fromat
- std::span