boost::optional 返回一个布尔值并不总是有效

Posted

技术标签:

【中文标题】boost::optional 返回一个布尔值并不总是有效【英文标题】:boost::optional returning a bool value doesn't always work 【发布时间】:2016-07-29 00:40:43 【问题描述】:

我遇到了一个我无法弄清楚的问题,希望有人可以帮助 (gcc 4.7.2,提升 1.59)

bool IsValidTest(int val) const

   if(val > 0)
       return func(); // func() returns boost::optional<SomeType>;

我希望可选项隐式转换为 bool ,但编译器抱怨

error: cannot convert boost::optional<SomeType> to bool in return

我确实看到了!运营商存在,因此解决方案是使用

return !!func();

现在,我想不通的是为什么上面的代码不能编译,下面的代码为什么会从函数返回时转换为bool

 if(func())
  // optional actually exists 

注意:我还注意到 IsValidTest() 在 Visual Studio 上没有给出任何编译错误

非常感谢任何帮助

【问题讨论】:

boost::optional 我认为应该可以转换为两个布尔值,所以它是你想要的模棱两可。 您必须使用旧版本的 M$VS,它不支持 explicit 关键字。 M$VS '13 does 是的,我使用的是 Visual Studio 2012 【参考方案1】:

boost::optional 定义了一个explicit operator bool

explicit表示编译器不会为你做隐式转换,你必须指定你要调用的操作符。

您使用了!!,但您也可以使用static_cast&lt;bool&gt;()。它适用于if,因为if 语句有关于operator bool 的特殊规则,即它在评估其表达式时忽略explicit 标识符。

【讨论】:

Re“它适用于if,因为if 语句需要bool”,不,它适用于if,因为if 需要一个条件 i>,它对explicit operator bool() 有一个特殊的规则。例如,仅使用 optional 直接作为 bool 变量的初始化器是行不通的。 我不太明白你的意思关于“仅仅使用可选的直接作为布尔变量的初始化器是行不通的”你能举个例子吗 @BubbleBoy 我的解释有点不对劲。它说这个bool b = returnOptional(); 可以工作,但它没有 @BubbleBoy: bool b = some_optional; 不会编译。此上下文需要bool 值,但没有到bool 的隐式转换。需要 bool 值的上下文不足以触发 explicit 转换。【参考方案2】:

关于

一个解决方案是使用

return !!func();

否。optional 显式转换为 bool 只是检查值是否存在,即它是否为空。这是通过explicit operator bool() 实现的,与使用 iostream 非常相似。

optional 实例在概念上充当可以为 null 的指针,并且显式转换为 bool 会检查是否为 null。

若要获取指向的对象(如果有),请使用* 在逻辑上取消引用(概念)指针。如果optional 为空,则会引发异常。或者在指针视图中,如果(概念)指针为空。

由于您希望将单个 bool 值作为函数的返回值,因此您必须在 optional 为空的情况下决定您想要什么。

【讨论】:

以上是关于boost::optional 返回一个布尔值并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章

你能 SWIG 一个 boost::optional<> 吗?

在 C++11 中实现 boost::optional

如何将构造函数参数转发给 boost::optional

boost::optional<std::string> 和 char[] 的隐式构造函数

从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用

pybind11 - 如果访问了结构的任何成员,则 boost::optional 结构的 std::vector 成员将被清空