std::optional用法
一、什么是 std::optionalstd::optional是 C17 引入的一个模板类定义在optional头文件中核心作用是表示一个“可能存在也可能不存在”的值。可以把它理解成一个“带状态的容器”当值存在时它保存这个值当值不存在时它标记为“空”无值状态。这解决了传统编程中用特殊值如-1、nullptr表示“无值”的弊端比如特殊值可能本身就是合法业务值让代码更清晰、更安全。二、核心用法代码示例下面通过简单示例展示std::optional的常用操作#includeiostream#includeoptional#includestring// 示例1返回可能存在的整数值std::optionalintfind_positive_number(intnum){if(num0){returnnum;// 有值时直接返回}returnstd::nullopt;// 无值时返回 nullopt空状态}// 示例2返回可能存在的字符串std::optionalstd::stringget_user_name(intuser_id){if(user_id1001){return张三;// 存在值}return{};// 等价于 std::nullopt无值}intmain(){// 1. 检查值是否存在autonum1find_positive_number(10);if(num1.has_value()){// 方法1has_value() 判断是否有值std::cout有效数字num1.value()std::endl;// 取值}autonum2find_positive_number(-5);if(!num2){// 方法2直接用 bool 上下文判断更简洁std::cout无有效数字std::endl;}// 2. 安全取值避免空值访问autonameget_user_name(999);// value_or如果有值则返回值无值则返回默认值std::cout用户名name.value_or(未知用户)std::endl;// 3. 直接访问需确保有值否则抛异常try{autoname2get_user_name(1001);std::cout有效用户名name2.value()std::endl;// 安全autoname3get_user_name(999);std::coutname3.value();// 无值时抛 std::bad_optional_access 异常}catch(conststd::bad_optional_accesse){std::cout\n错误e.what()std::endl;}// 4. 重置为无值状态std::optionalintopt5;opt.reset();// 变为空状态std::cout重置后是否有值std::boolalphaopt.has_value()std::endl;return0;}代码输出有效数字10 无有效数字 用户名未知用户 有效用户名张三 错误bad optional access 重置后是否有值false三、关键特性与注意事项模板特性std::optionalT中T可以是任意类型基本类型、自定义类型、甚至容器但T不能是void、std::nullptr_t也不能是另一个std::optionalC20 后可嵌套但不推荐。内存占用std::optionalT的大小约等于sizeof(T) 11 个字节用于存储“是否有值”的状态无额外堆内存分配值直接存在栈上。空值表示用std::nullopt表示空状态推荐也可以用{}或std::optionalT()初始化空的optional。取值方式value()有值时返回值无值时抛std::bad_optional_access异常value_or(default_val)有值返回值无值返回默认值最安全推荐日常使用解引用*opt直接访问值但需确保有值无值时行为未定义类似访问空指针。四、实际应用场景函数返回值函数可能失败/无结果时如查找数据、解析字符串替代“特殊值注释”的方式。可选参数替代默认参数的部分场景如参数可选且无合适默认值。类成员表示类的可选属性如用户的“手机号”可能存在也可能未填写。总结std::optional是 C17 提供的“可选值”类型用于安全表示“值可能存在/不存在”替代传统特殊值方案核心操作has_value()判断值是否存在、value_or()安全取值、std::nullopt表示空状态优势代码更清晰、避免特殊值歧义、无额外堆内存开销是处理“可选值”的最佳实践。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422693.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!