现代C++(11/14/17)演进详解

236 阅读3分钟

三个版本的主要区别和核心特性

C++11 (2011年) - 重大革新

C++11是自1998年以来C++语言的第一次重大更新,带来了革命性的变化。

核心语言特性

  1. 自动类型推导 (auto)

    auto x = 5; // int
    auto ptr = new auto(10.0); // double*
    
  2. 范围for循环

    std::vector<int> vec = {1, 2, 3};
    for(auto& v : vec) {
        v *= 2;
    }
    
  3. 右值引用和移动语义

    std::string str1 = "Hello";
    std::string str2 = std::move(str1); // 移动而非复制
    
  4. Lambda表达式

    auto func = [](int x) { return x * x; };
    std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
    
  5. nullptr替代NULL

    int* ptr = nullptr; // 类型安全的空指针
    
  6. 强类型枚举

    enum class Color { Red, Green, Blue };
    Color c = Color::Red; // 必须使用作用域限定
    

标准库增强

  1. 智能指针

    std::unique_ptr<int> uptr(new int(10));
    std::shared_ptr<int> sptr = std::make_shared<int>(20);
    
  2. 线程支持

    std::thread t([](){ std::cout << "Hello from thread"; });
    t.join();
    
  3. 正则表达式

    std::regex pattern("\\d+");
    bool match = std::regex_match("123", pattern);
    

C++14 (2014年) - 完善和优化

C++14主要是对C++11的完善和补充,没有引入重大新概念。

核心语言改进

  1. 泛型Lambda

    auto lambda = [](auto x, auto y) { return x + y; };
    
  2. 函数返回类型推导

    auto add(int a, int b) { return a + b; } // 返回类型自动推导为int
    
  3. 二进制字面量

    int binary = 0b101010; // 42
    
  4. 数字分隔符

    int million = 1'000'000;
    
  5. 变量模板

    template<typename T>
    constexpr T pi = T(3.1415926535897932385);
    

标准库增强

  1. make_unique

    auto ptr = std::make_unique<int>(42);
    
  2. shared_timed_mutex

    std::shared_timed_mutex mtx;
    {
        std::shared_lock<std::shared_timed_mutex> lock(mtx); // 共享读锁
    }
    

C++17 (2017年) - 重要演进

C++17引入了更多现代化特性,进一步简化代码编写。

核心语言特性

  1. 结构化绑定

    std::pair<int, double> p{1, 2.5};
    auto [i, d] = p; // i=1, d=2.5
    
  2. if/switch初始化语句

    if (auto it = m.find(key); it != m.end()) {
        // 使用it
    }
    
  3. constexpr if

    template <typename T>
    auto get_value(T t) {
        if constexpr (std::is_pointer_v<T>) {
            return *t;
        } else {
            return t;
        }
    }
    
  4. 折叠表达式

    template<typename... Args>
    auto sum(Args... args) { return (args + ...); }
    
  5. 内联变量

    inline int global_var = 42; // 头文件中定义
    

标准库增强

  1. std::optional

    std::optional<int> maybeInt = getValue();
    if (maybeInt) {
        use(*maybeInt);
    }
    
  2. std::variant

    std::variant<int, double, std::string> v;
    v = "hello";
    std::cout << std::get<std::string>(v);
    
  3. std::filesystem

    namespace fs = std::filesystem;
    fs::path p = "/usr/bin";
    if (fs::exists(p)) { /*...*/ }
    
  4. 并行算法

    std::vector<int> v = {...};
    std::sort(std::execution::par, v.begin(), v.end());
    

版本对比总结

特性类别C++11C++14C++17
类型推导auto变量泛型lambda, 函数返回类型推导结构化绑定
并发支持线程库,原子操作shared_timed_mutex并行算法
智能指针unique_ptr, shared_ptrmake_unique-
函数式编程lambda表达式泛型lambdaconstexpr if, 折叠表达式
实用工具nullptr, 强类型枚举二进制字面量,数字分隔符optional, variant, any
文件系统--std::filesystem
模板改进变参模板变量模板if constexpr, 折叠表达式

现代C++编程建议

  1. 优先使用智能指针而非裸指针管理资源
  2. 利用auto简化代码但保持可读性
  3. 多用标准库算法而非手写循环
  4. 考虑移动语义优化性能关键代码
  5. 使用现代并发工具而非平台特定API
  6. 采用RAII原则管理所有资源

现代C++的这些改进使得代码更简洁、更安全、更高效,同时也降低了开发难度和维护成本。从C++11到C++17,语言逐渐向更现代化、更表达力强的方向发展。