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::optionalexplicit
关键字。 M$VS '13 does
是的,我使用的是 Visual Studio 2012
【参考方案1】:
boost::optional
定义了一个explicit
operator bool
。
explicit
表示编译器不会为你做隐式转换,你必须指定你要调用的操作符。
您使用了!!
,但您也可以使用static_cast<bool>()
。它适用于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<> 吗?
boost::optional<std::string> 和 char[] 的隐式构造函数
从非常量到常量模板参数的隐式转换在 boost::optional 中不起作用
pybind11 - 如果访问了结构的任何成员,则 boost::optional 结构的 std::vector 成员将被清空