关于Boost::optional<bool>两种取值写法是否等价的技术问询
关于boost::optional的两行代码等价性问题
嘿,这个问题抓得很准!咱们直接说结论:这两行代码并不等价,差异会在特定场景下显现出来,下面给你拆解清楚:
首先得明确boost::optional<bool>的两个核心特性:
- 当你把
optional对象直接赋值给bool时(比如bool smthelse = isSet;),它调用的是operator bool(),返回的是这个optional是否已经被初始化(也就是有没有持有有效值)——简单说就是“有没有值”,而非“值是什么”。 - 而
*isSet是解引用操作,会直接获取optional内部存储的那个bool值。
那咱们对比两种关键场景:
当
isSet没有值时:isSet ? *isSet : false→ 条件为false,结果是falsebool smthelse = isSet;→isSet转bool是false,结果也是false
这时候两者结果一致。
当
isSet持有false值时(比如isSet = boost::make_optional(false);):isSet ? *isSet : false→ 条件为true(因为isSet有值),取*isSet即falsebool smthelse = isSet;→isSet转bool是true(因为它有值,不管值是true还是false),结果是true
这时候两者结果完全相反!
如果想要和原代码isSet ? *isSet : false等价的简洁写法,推荐用boost::optional的value_or方法:
bool smthelse = isSet.value_or(false);
这行代码的逻辑和原代码完全一致,可读性还更强~
内容的提问来源于stack exchange,提问作者Eduard Rostomyan
相关产品推荐
相关产品推荐

