一、C++11 的主要新特性("现代 C++"的起点)
1. 自动类型推导 auto
自动推导变量类型,避免冗长声明
cpp
auto x = 10; // int
auto s = "hello"; // const char*
2. 范围 for 循环
cpp
std::vector<int> v{1, 2, 3};
for (auto val : v) {
std::cout << val << std::endl;
}
3. 右值引用(&&
)与移动语义
优化性能,避免不必要的拷贝
cpp
std::vector<int> foo() { return std::vector<int>{1, 2, 3}; }
std::vector<int> v = foo(); // 移动构造
4. 智能指针 std::unique_ptr
和 std::shared_ptr
自动释放资源,避免内存泄漏。
cpp
auto ptr = std::make_unique<int>(10);
5. nullptr
替代 NULL
cpp
void func(int* p);
func(nullptr); // 更安全,避免歧义
二、C++14 的新特性(小而精)
1. 返回类型推导
cpp
auto add(int a, int b) {
return a + b;
}
2. 通用 Lambda 表达式
Lambda 参数支持 auto,适用于模板编程
cpp
auto add = [](auto a, auto b) { return a + b; };
3. 二进制字面量
cpp
int x = 0b1101; // 等于 13
三、C++17 的新特性(实用增强)
1. 结构化绑定
cpp
std::tuple<int, std::string> t{1, "hello"};
auto [id, name] = t;
2. if constexpr
(编译期条件)
用于模板元编程,替代 SFINAE
cpp
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::variant
与 std::optional
cpp
std::optional<int> maybeInt = std::nullopt;
std::variant<int, std::string> v = "hello";
4. inline
变量
解决头文件中全局变量多次定义问题
cpp
inline int globalCount = 0;
四、C++20 的重大突破
1. 概念(Concepts)
用于限制模板类型,提高可读性和错误提示质量
cpp
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)
可用于异步任务、生成器等
cpp
std::generator<int> gen() {
for (int i = 0; i < 10; ++i)
co_yield i;
}
3. 范围(ranges)
函数式风格处理集合
cpp
#include <ranges>
auto evens = std::views::iota(1, 100) | std::views::filter([](int i) { return i % 2 == 0; });
4. 三路比较 <=>
(太空船操作符)
自动生成 <
, ==
, >
cpp
struct A {
int x;
auto operator<=>(const A&) const = default;
};
五、C++23(增强质量与实用)
1. std::expected
替代 std::optional
和异常的错误处理
cpp
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
用于在编译时判断是否为常量求值
cpp
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++ 的时代