文章介绍了一些的C++新特性,当然,这并非全部。
C++17
C++17引入了结构化绑定(Structured Bindings),使得可以将结构体、数组或元组的元素直接解包到独立的变量中。这在以前需要手动解包的情况下非常有用。
std::tuple<int, double, std::string> tpl = {1, 2.3, "text"}; |
2. if和switch的初始化语句
在C++17中,可以在if和switch语句中直接包含初始化语句,这样可以提高代码的可读性和简洁性。
if (auto it = myMap.find(key); it != myMap.end()) { |
3. std::optional
std::optional
提供了一种类型安全的方式来表示一个值可能存在或不存在,避免了使用指针或特殊值表示空值的问题。
std::optional<int> maybeInt = 42; |
4. std::variant
std::variant
是一个类型安全的联合体,可以存储多个类型中的一个。这使得可以更方便地处理多种类型的值。
std::variant<int, float, std::string> v; |
5. std::any
std::any
可以存储任意类型的值,并在运行时确定类型。这对于需要在运行时处理各种类型的情况非常有用。
std::any a = 42; |
6. std::filesystem
std::filesystem
提供了跨平台的文件系统操作,使得文件和目录的管理更加方便。
|
7. 内联变量
内联变量允许在头文件中定义变量,而无需担心重复定义的问题。
inline int myVar = 42; |
8. constexpr lambda
Lambda 表达式现在可以是 constexpr
,允许在编译时进行计算,提高了程序的性能和效率。
auto add = [](int a, int b) constexpr { return a + b; }; |
9. 折叠表达式
折叠表达式(Fold Expressions)简化了对可变参数模板的操作,使得模板的使用更加灵活和方便。
template<typename... Args> |
10. 其他改进
- 模板参数推导:类模板可以根据构造函数的参数自动推导模板参数,减少了模板使用时的冗余。
- 增强的
constexpr
:更多的标准库函数现在是constexpr
,如std::strlen
,可以在编译时进行计算。 std::byte
类型:提供了一种类型安全的字节表示,避免了直接操作原始字节的问题。
C++20
模块化编程 (Modules)
C++20引入了模块化编程的概念,这是对传统的#include预处理器指令的一种更现代化的替代方式。模块化编程使得代码更加模块化和可重用,同时提高了构建速度。
// math.h |
概念 (Concepts)
概念是对模板类型的约束,它们使得模板代码更加清晰并提供更好的错误信息。
template <typename T> |
范围式for循环的初始化语句
C++20允许在范围式for循环中使用初始化语句,使得代码更加简洁。
std::vector<int> numbers = {1, 2, 3, 4, 5}; |
常量求值 (Constexpr)
C++20扩展了constexpr的能力,允许在编译时计算更复杂的表达式和逻辑。
constexpr int factorial(int n) { |
类型特征 (Type Traits)
C++20引入了一些新的类型特征,例如is_nothrow_convertible_v和is_invocable_v,用于检查类型的特性。
if constexpr (std::is_nothrow_convertible_v<int, double>) { |
Calendar和Timezone库
C++20新增了对日期、时间和时区的支持,使得处理日期和时间更加方便和可靠。
|
- 本文作者: hzr
- 本文链接: https://HZR0709.github.io/2024/06/15/Cpp-New-feature/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!