📜  C++ 20的功能(1)

📅  最后修改于: 2023-12-03 14:59:44.523000             🧑  作者: Mango

C++ 20的功能介绍

C++ 20是C++标准的最新版本,自2017年开始制定并于2020年发布。本文将重点介绍C++ 20引入的一些新功能。

模块化

C++ 20引入了模块化的概念,目的是减少头文件的依赖和提高编译速度。通过module关键字定义模块,使用import关键字导入模块。例如:

export module my_module;

import <iostream>;

export void foo()
{
    std::cout << "Hello, world!\n";
}

使用foo()函数时,只需要在源文件中添加import my_module;即可,无需再包含iostream头文件。

consteval

C++ 20引入了consteval关键字,用于标记在编译期可求值的函数。这样编译器可以在编译期计算函数返回值,从而加速程序执行。例如:

consteval int add(int a, int b)
{
    return a + b;
}
constexpr if

C++ 17引入了if constexpr,而C++ 20进一步扩展了这个概念,引入了constexpr ifconstexpr if可以用在函数模板中,用于根据模板参数的值或类型进行条件编译。例如:

template<typename T>
void print(T value)
{
    if constexpr (std::is_floating_point_v<T>)
    {
        std::cout << std::fixed << value << std::endl;
    }
    else
    {
        std::cout << value << std::endl;
    }
}
聚合初始化

C++ 20允许将聚合体初始化为其成员的默认值。例如:

struct Point
{
    int x = 0;
    int y = 0;
};

Point p{}; // x和y都初始化为0
标准库变化
std::span

std::span是C++ 20引入的新容器,用于表示一个由连续存储的元素组成的序列。它主要用于从已有的数组或内存块中创建视图,并可以在元素上执行操作,例如切片等。例如:

std::array<int, 5> arr { 1, 2, 3, 4, 5 };
std::span<int> sp { arr };
for (auto i : sp.subspan(1, 3))
{
    std::cout << i << " "; // 输出2 3 4
}
std::ranges

std::ranges是C++ 20引入的一组库,用于处理序列。std::ranges包括许多新函数和类型,例如std::views::filterstd::views::transform等。这些函数包装迭代器,返回在序列上执行操作的新迭代器。例如:

auto even_filter = [](int i) { return i % 2 == 0; };
std::vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
auto even_view = v | std::views::filter(even_filter);
for (auto i : even_view)
{
    std::cout << i << " "; // 输出2 4 6 8
}
Conclusion

C++ 20引入了许多新功能,用于提高代码的可读性、可维护性和性能。模块化、consteval、constexpr if、聚合初始化、std::ranges等功能都可以在正确使用的情况下为我们的开发带来便捷和效率。