使用选项表示缺少值

在 C++ 17 之前,使用值为 nullptr 的指针通常表示没有值。对于已动态分配且已由指针管理的大型对象,这是一个很好的解决方案。但是,这种解决方案不适用于像 int 这样的小型或原始类型,它们很少被指针动态分配或管理。std::optional 为这个常见问题提供了可行的解决方案。

在这个例子中,定义了 struct Person。一个人有可能有宠物,但不是必需的。因此,Personpet 成员用 std::optional 包装器声明。

#include <iostream>
#include <optional>
#include <string>

struct Animal {
    std::string name;
};

struct Person {
    std::string name;
    std::optional<Animal> pet;
};

int main() {
    Person person;
    person.name = "John";

    if (person.pet) {
        std::cout << person.name << "'s pet's name is " <<
            person.pet->name << std::endl;
    }
    else {
        std::cout << person.name << " is alone." << std::endl;
    }
}