std::optional与std::nullopt 2025-08-15

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类型

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容