新特性集锦:

发布时间 2023-08-18 12:03:45作者: 石中火本火

新特性集锦:

std::span(C++20)

使用std::span可以帮助我们更好地管理数组,从而避免越界问题。

  1. 使用std::span的构造函数来创建一个指向char数组的span对象,并指定其长度。这样可以确保我们只访问数组中有效的元素,而不会越界。

    char arr[] = "hello world"; 
    std::span<char> s(arr, 11); // 创建一个指向arr的span对象,长度为11 
    
  2. 使用std::span的at()函数来访问数组元素,而不是使用[]运算符。at()函数会检查索引是否越界,如果越界则会抛出std::out_of_range异常。

char arr[] = "hello world"; 
std::span<char> s(arr, 11); 
char c = s.at(5); //访问第6个元素,不会越界 
char d = s.at(20); //访问第21个元素,会抛出std::out_of_range异常
  1. 使用std::span的subspan()函数来创建一个子span对象,从而避免访问超出数组范围的元素。

    char arr[] = "hello world";
    std::span<char> s(arr, 11); 
    std::span<char> sub = s.subspan(3, 4); // 创建一个从第4个元素开始,长度为4的子span对象 ```
    

std::variant(C++17)

std::variant是C++17中引入的一个新特性,它是一种类型安全的联合类型,可以存储多种不同类型的值,但只能同时存储其中的一种类型,是Union的升级版。 可以理解成类似于python中的无类型变量。类型安全是指在编程语言中,对于每个变量和表达式都有一个明确的数据类型,并且编译器会在编译时检查类型是否匹配,从而避免了类型不匹配的错误。这代表std::variant对一个变量可以匹配多种类型。

使用std::variant需要包含头文件,下面是一个简单的示例:

#include <variant> 
#include <iostream> 
int main() {
	std::variant<int, double, std::string> v;
    v = 42;
    std::cout << std::get<int>(v) << std::endl; // 输出42
    v = 3.14;
    std::cout << std::get<double>(v) << std::endl; // 输出3.14
    v = "hello";
    std::cout << std::get<std::string>(v) << std::endl; // 输出hello
    return 0;
} 

如果我们使用std::get函数获取v中存储的值的类型与实际存储的类型不一致,将会抛出std::bad_variant_access异常。