为什么不推荐使用 boost::optional::is_initialized() ?

新手上路,请多包涵

我今天注意到 boost::optional::is_initialized()Boost 1.64.0 参考 中被标记为已弃用。我的项目大量使用 is_initialized() 检查 boost::optional 是否包含值。

我看不到任何其他方法可以正确测试 boost::optional 是否已初始化,我是否遗漏了什么?

The boost::optional has a explicit operator bool() , meaning that I can do if(foo){...} if foo is a boost::optional . However, this would give wrong results if foo is a boost::optional<bool> or some other boost::optional<T> where T is convertible to bool .

Boost 希望用户做什么?

原文由 Bernard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 578
1 个回答

但是,如果 foo 是 boost::optional 或其他一些 boost::optional 其中 T 可转换为 bool,这将给出错误的结果。

不,因为没有对基础类型的隐式转换。可选项的“真实性”¹ 总是 指其初始化状态。

只有在关系运算符中才会有隐式转换发生的 _印象_。但是,这并不是对底层类型进行隐式转换,而是显式地 提升 运算符。

¹我的意思是上下文(显式)布尔转换

更新

确实对于 boost::optional<bool> 在 c++11 之前的模式中 有一个警告:

其次,尽管 optional<> 在 C++11 中提供了到 bool 的上下文转换,但这会退回到旧编译器上的隐式转换

在这种情况下,明确比较 boost::none 显然更好。

原文由 sehe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题