c++17引入的,表示一个可能包含值或可能不包含值的容器。
提供了一种类型安全的方式来表示“可能有值”的概念,避免了使用特殊值(nullptr,-1)或额外的布尔值来表示缺失值
//头文件
#include <optional>
#include <string>
// 创建空的 optional
std::optional<int> emptyOpt;
std::optional<std::string> emptyStrOpt = std::nullopt;
// 创建包含值的 optional
std::optional<int> opt1 = 42;
std::optional<std::string> opt2 = "Hello";
auto opt3 = std::make_optional(3.14); // 推导为 std::optional<double>
//检查是否有值
std::optional<int> opt = 10;
if (opt) { // 或 if(opt.has_value())
std::cout << "有值: " << *opt << "\n";
} else {
std::cout << "无值\n";
}
值的访问
std::optional<std::string> opt="hello";
std::cout<<*opt<<std::endl;//解引用
std::cout<<opt->size()<<std::endl;//这里调用的是std::string类的size()成员函数,不是std::optional的成员函数
//使用value()方法,这个方法中会检查是否有值,无值则抛出std::bad_optional_access
std::cout<<opt.value()<<endl;
//std::value_or() 由std::optional提供的,其作用是如果有值就返回这个值,否则就返回指定的默认值
std::optional<int> opt; // 创建一个空的 optional<int>
std::cout << opt.value_or(42) << "\n"; // 输出42
修改std::optional的值举例
std::optional<int> opt=std::nullopt;
opt=42;
opt.emplace(5);//原地构造
opt.reset();//重置为空状态
可以使用比较操作符
std::optional<int> a = 1;
std::optional<int> b = 2;
std::optional<int> c;
a < b; // true
a == 1; // true
c == std::nullopt; // true
std::nullopt
c++17中引入的,是一个常量
用于表示std::optional不包含值的状态(即“空”状态)。
std::nullptr用于指针类型
std::nullopt用于std::optional类型