新特性集锦:
std::span(C++20)
使用std::span可以帮助我们更好地管理数组,从而避免越界问题。
-
使用std::span的构造函数来创建一个指向char数组的span对象,并指定其长度。这样可以确保我们只访问数组中有效的元素,而不会越界。
char arr[] = "hello world"; std::span<char> s(arr, 11); // 创建一个指向arr的span对象,长度为11
-
使用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异常
-
使用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
异常。