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