C++ 各标准的新特性
C++ 各标准的新特性:详细解释和示例
C++ 标准从 C++98 到 C++20 引入了很多重要的新特性。为了方便理解和查找,我将 C++ 各个版本(C++11、C++14、C++17、C++20)的主要新特性列出。
C++ 标准的新特性概览
特性 | C++11 | C++14 | C++17 | C++20 |
---|---|---|---|---|
自动类型推断(auto ) | ✔️ | ✔️ | ✔️ | ✔️ |
范围-based for 循环 | ✔️ | ✔️ | ✔️ | ✔️ |
Lambda 表达式 | ✔️ | ✔️ | ✔️ | ✔️ |
智能指针(unique_ptr , shared_ptr ) | ✔️ | ✔️ | ✔️ | ✔️ |
右值引用和移动语义 | ✔️ | ✔️ | ✔️ | ✔️ |
constexpr | ✔️ | ✔️ | ✔️ | ✔️ |
线程支持(<thread> ) | ✔️ | ✔️ | ✔️ | ✔️ |
std::make_unique | ❌ | ✔️ | ✔️ | ✔️ |
内联变量(inline variable ) | ❌ | ❌ | ✔️ | ✔️ |
std::optional | ❌ | ❌ | ✔️ | ✔️ |
结构化绑定声明 | ❌ | ❌ | ✔️ | ✔️ |
std::filesystem | ❌ | ❌ | ✔️ | ✔️ |
模块(modules ) | ❌ | ❌ | ❌ | ✔️ |
概念(Concepts ) | ❌ | ❌ | ❌ | ✔️ |
协程(coroutines ) | ❌ | ❌ | ❌ | ✔️ |
std::ranges | ❌ | ❌ | ❌ | ✔️ |
C++11 新特性详细解释与示例
-
自动类型推断(
auto
)auto
让编译器根据表达式的类型自动推断变量的类型,避免显式声明。
示例:
auto x = 5; // x 推断为 int auto y = 3.14; // y 推断为 double
-
范围-based for 循环
- 通过
range-based for
循环简化容器遍历。
示例:
std::vector<int> nums = {1, 2, 3, 4}; for (auto n : nums) { std::cout << n << " "; // 输出:1 2 3 4 }
- 通过
-
Lambda 表达式
- 可以定义匿名函数,尤其在处理短小的函数时非常方便。
示例:
std::vector<int> nums = {1, 2, 3, 4}; std::for_each(nums.begin(), nums.end(), [](int n) { std::cout << n << " "; // 输出:1 2 3 4 });
-
右值引用和移动语义
- 引入了右值引用,使得对象的移动变得可能,提升了性能,避免了不必要的拷贝。
示例:
std::vector<int> createVector() { return std::vector<int>{1, 2, 3}; // 使用移动语义,避免拷贝 }
-
constexpr
constexpr
函数在编译时求值,允许在编译阶段执行一些计算,提升效率。
示例:
constexpr int square(int x) { return x * x; } int arr[square(3)]; // 在编译时计算 9
C++14 新特性详细解释与示例
-
std::make_unique
std::make_unique
是一种创建unique_ptr
的安全方法。
示例:
std::unique_ptr<int> p = std::make_unique<int>(10); // 创建并初始化
-
Lambda 表达式的泛型支持
- C++14 允许 Lambda 表达式使用
auto
关键字来推断参数类型。
示例:
auto add = [](auto a, auto b) { return a + b; }; std::cout << add(1, 2) << std::endl; // 输出:3 std::cout << add(1.1, 2.2) << std::endl; // 输出:3.3
- C++14 允许 Lambda 表达式使用
C++17 新特性详细解释与示例
-
std::optional
std::optional
表示一个可能包含值的对象,适用于返回可能失败的操作结果。
示例:
std::optional<int> divide(int x, int y) { if (y == 0) return std::nullopt; // 返回空值 return x / y; }
-
结构化绑定声明
- 允许一次性解构多个值(如从
std::pair
或std::tuple
中提取)。
示例:
std::pair<int, double> p = {10, 3.14}; auto [x, y] = p; // x = 10, y = 3.14
- 允许一次性解构多个值(如从
-
std::filesystem
- C++17 引入了标准库中的文件系统支持,可以更方便地进行文件操作。
示例:
#include <filesystem> namespace fs = std::filesystem; for (const auto& entry : fs::directory_iterator("/path/to/dir")) { std::cout << entry.path() << std::endl; }
C++20 新特性详细解释与示例
-
模块(
modules
)- 模块可以减少头文件的编译时间,提高构建效率。
示例(C++20 模块声明):
export module my_module; // 模块声明 export int add(int a, int b) { return a + b; }
-
概念(
Concepts
)Concepts
用于限制模板类型,可以使模板代码更加健壮和可读。
示例:
template <typename T> concept Addable = requires(T a, T b) { { a + b } -> std::same_as<T>; }; template <Addable T> T add(T a, T b) { return a + b; }
-
协程(
coroutines
)- 协程支持简化异步编程,允许你以同步的方式编写异步代码。
示例:
#include <coroutine> #include <iostream> std::coroutine_handle<> handle; std::string async_func() { co_return "Hello from coroutine"; } int main() { auto result = async_func(); std::cout << result << std::endl; // 输出:"Hello from coroutine" }
-
std::ranges
ranges
提供了对容器和序列的更简便的操作方式,避免了手动使用迭代器。
示例:
#include <ranges> std::vector<int> v = {1, 2, 3, 4}; auto result = v | std::ranges::transform([](int n) { return n * 2; }); for (auto& n : result) { std::cout << n << " "; // 输出:2 4 6 8 }
总结
C++标准 | 新特性 |
---|---|
C++11 | 自动类型推断、右值引用、constexpr 、范围-based for 循环、Lambda 表达式 |
C++14 | std::make_unique 、Lambda 泛型支持 |
| C++17 | std::optional
、结构化绑定声明、std::filesystem
|
| C++20 | 模块、概念、协程、std::ranges
|
每个新标准引入的新特性都增强了 C++ 的表达能力和编程效率,通过这些新特性,可以更加高效、安全和简洁地编写 C++ 代码。