【简述】C++11/14/17/20/23 中的关键新特性

发布于:2025-07-27 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、C++11 的主要新特性(“现代 C++”的起点)

1. 自动类型推导 auto

        自动推导变量类型,避免冗长声明

auto x = 10;       // int
auto s = "hello";  // const char*

2. 范围 for 循环

std::vector<int> v{1, 2, 3};
for (auto val : v) {
    std::cout << val << std::endl;
}

3. 右值引用(&&)与移动语义

        优化性能,避免不必要的拷贝

std::vector<int> foo() { return std::vector<int>{1, 2, 3}; }

std::vector<int> v = foo(); // 移动构造

4. 智能指针 std::unique_ptrstd::shared_ptr

        自动释放资源,避免内存泄漏。

auto ptr = std::make_unique<int>(10);

5. nullptr 替代 NULL

void func(int* p);
func(nullptr);  // 更安全,避免歧义

二、C++14 的新特性(小而精)

1. 返回类型推导

auto add(int a, int b) {
    return a + b;
}

2. 通用 Lambda 表达式

        Lambda 参数支持 auto,适用于模板编程

auto add = [](auto a, auto b) { return a + b; };

3. 二进制字面量

int x = 0b1101;  // 等于 13

三、C++17 的新特性(实用增强)

1. 结构化绑定

std::tuple<int, std::string> t{1, "hello"};
auto [id, name] = t;

2. if constexpr(编译期条件)

        用于模板元编程,替代 SFINAE

template<typename T>
void print(T val) {
    if constexpr (std::is_integral_v<T>) {
        std::cout << "整数: " << val << "\n";
    } else {
        std::cout << "其他: " << val << "\n";
    }
}

3. std::variantstd::optional

std::optional<int> maybeInt = std::nullopt;
std::variant<int, std::string> v = "hello";

4. inline 变量

        解决头文件中全局变量多次定义问题

inline int globalCount = 0;

四、C++20 的重大突破

1. 概念(Concepts)

        用于限制模板类型,提高可读性和错误提示质量

template<typename T>
concept Addable = requires(T a, T b) {
    a + b;
};

template<Addable T>
T add(T a, T b) {
    return a + b;
}

2. 协程(coroutines)

        可用于异步任务、生成器等

std::generator<int> gen() {
    for (int i = 0; i < 10; ++i)
        co_yield i;
}

3. 范围(ranges)

        函数式风格处理集合

#include <ranges>
auto evens = std::views::iota(1, 100) | std::views::filter([](int i) { return i % 2 == 0; });

4. 三路比较 <=>(太空船操作符)

        自动生成 <, ==, >

struct A {
    int x;
    auto operator<=>(const A&) const = default;
};

五、C++23(增强质量与实用)

1. std::expected

        替代 std::optional 和异常的错误处理

std::expected<int, std::string> safe_div(int a, int b) {
    if (b == 0) return std::unexpected("Divide by zero");
    return a / b;
}

2. if consteval

        用于在编译时判断是否为常量求值

consteval int square(int x) {
    return x * x;
}

3. 多维数组支持 mdspan(新库)

        标准化了高效、多维数组访问

标准 关键新特性
C++11 auto, nullptr, Lambda, 智能指针, 右值引用, 移动语义
C++14 返回类型推导,通用 Lambda,二进制字面量
C++17 结构化绑定, if constexpr, variant, optional, inline 变量
C++20 Concepts, Coroutines, Ranges, <=>, Modules(模块)
C++23 std::expected, consteval, if consteval, 多维数组支持(mdspan)

写在最后

        C++ 从 C++98 到 C++23,经历了从手工管理内存的语言向现代安全高效表达式的演化,新特性为我们带来了更优雅的语法、更强的性能控制以及更安全的工程实践方式

        未来是现代 C++ 的时代


网站公告

今日签到

点亮在社区的每一天
去签到