三个版本的主要区别和核心特性
C++11 (2011年) - 重大革新
C++11是自1998年以来C++语言的第一次重大更新,带来了革命性的变化。
核心语言特性
-
自动类型推导 (auto)
auto x = 5; // int auto ptr = new auto(10.0); // double* -
范围for循环
std::vector<int> vec = {1, 2, 3}; for(auto& v : vec) { v *= 2; } -
右值引用和移动语义
std::string str1 = "Hello"; std::string str2 = std::move(str1); // 移动而非复制 -
Lambda表达式
auto func = [](int x) { return x * x; }; std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; }); -
nullptr替代NULL
int* ptr = nullptr; // 类型安全的空指针 -
强类型枚举
enum class Color { Red, Green, Blue }; Color c = Color::Red; // 必须使用作用域限定
标准库增强
-
智能指针
std::unique_ptr<int> uptr(new int(10)); std::shared_ptr<int> sptr = std::make_shared<int>(20); -
线程支持
std::thread t([](){ std::cout << "Hello from thread"; }); t.join(); -
正则表达式
std::regex pattern("\\d+"); bool match = std::regex_match("123", pattern);
C++14 (2014年) - 完善和优化
C++14主要是对C++11的完善和补充,没有引入重大新概念。
核心语言改进
-
泛型Lambda
auto lambda = [](auto x, auto y) { return x + y; }; -
函数返回类型推导
auto add(int a, int b) { return a + b; } // 返回类型自动推导为int -
二进制字面量
int binary = 0b101010; // 42 -
数字分隔符
int million = 1'000'000; -
变量模板
template<typename T> constexpr T pi = T(3.1415926535897932385);
标准库增强
-
make_unique
auto ptr = std::make_unique<int>(42); -
shared_timed_mutex
std::shared_timed_mutex mtx; { std::shared_lock<std::shared_timed_mutex> lock(mtx); // 共享读锁 }
C++17 (2017年) - 重要演进
C++17引入了更多现代化特性,进一步简化代码编写。
核心语言特性
-
结构化绑定
std::pair<int, double> p{1, 2.5}; auto [i, d] = p; // i=1, d=2.5 -
if/switch初始化语句
if (auto it = m.find(key); it != m.end()) { // 使用it } -
constexpr if
template <typename T> auto get_value(T t) { if constexpr (std::is_pointer_v<T>) { return *t; } else { return t; } } -
折叠表达式
template<typename... Args> auto sum(Args... args) { return (args + ...); } -
内联变量
inline int global_var = 42; // 头文件中定义
标准库增强
-
std::optional
std::optional<int> maybeInt = getValue(); if (maybeInt) { use(*maybeInt); } -
std::variant
std::variant<int, double, std::string> v; v = "hello"; std::cout << std::get<std::string>(v); -
std::filesystem
namespace fs = std::filesystem; fs::path p = "/usr/bin"; if (fs::exists(p)) { /*...*/ } -
并行算法
std::vector<int> v = {...}; std::sort(std::execution::par, v.begin(), v.end());
版本对比总结
| 特性类别 | C++11 | C++14 | C++17 |
|---|---|---|---|
| 类型推导 | auto变量 | 泛型lambda, 函数返回类型推导 | 结构化绑定 |
| 并发支持 | 线程库,原子操作 | shared_timed_mutex | 并行算法 |
| 智能指针 | unique_ptr, shared_ptr | make_unique | - |
| 函数式编程 | lambda表达式 | 泛型lambda | constexpr if, 折叠表达式 |
| 实用工具 | nullptr, 强类型枚举 | 二进制字面量,数字分隔符 | optional, variant, any |
| 文件系统 | - | - | std::filesystem |
| 模板改进 | 变参模板 | 变量模板 | if constexpr, 折叠表达式 |
现代C++编程建议
- 优先使用智能指针而非裸指针管理资源
- 利用auto简化代码但保持可读性
- 多用标准库算法而非手写循环
- 考虑移动语义优化性能关键代码
- 使用现代并发工具而非平台特定API
- 采用RAII原则管理所有资源
现代C++的这些改进使得代码更简洁、更安全、更高效,同时也降低了开发难度和维护成本。从C++11到C++17,语言逐渐向更现代化、更表达力强的方向发展。