optional是一个模板类:

template <class T>
class optional;

它内部有两种状态,要么有值(T类型),要么没有值(std::nullopt)。有点像T*指针,要么指向一个T类型,要么是空指针(nullptr)。

std::optional有以下几种构造方式:

#include <iostream>
#include <optional>
using namespace std;
 
int main() {
    optional<int> o1;  //什么都不写时默认初始化为nullopt
    optional<int> o2 = nullopt;  //初始化为无值
    optional<int> o3 = 10;  //用一个T类型的值来初始化
    optional<int> o4 = o3;  //用另一个optional来初始化
    return 0;
}

查看一个optional对象是否有值,可以直接用if,或者用has_value()

#include <iostream>
#include <optional>
using namespace std;
 
int main() {
    optional<int> o1;
    if (o1) {
        printf("o1 has value\n");
    }
    if (o1.has_value()) {
        printf("o1 has value\n");
    }
    return 0;
}

当一个optional有值时,可以通过用指针的方式(*号和->号)来使用它,或者用.value()拿到它的值:

#include <iostream>
#include <optional>
#include <string>
using namespace std;
 
int main() {
    optional<int> o1 = 5;
    printf("%d\n", *o1);
    optional<string> o2 = "hello";
    printf("%s\n", o2->c_str());
    printf("%s\n", o2.value().c_str());
    return 0;
}

将一个有值的optional变为无值,用.reset()。该函数会将已存储的T类型对象析构掉

#include <iostream>
#include <optional>
using namespace std;
 
int main() {
    optional<int> o1 = 5;
    o1.reset();
}