C++ boost::可选返回bool值';我不总是工作

C++ boost::可选返回bool值';我不总是工作,c++,boost,C++,Boost,我遇到了一个我无法解决的问题,希望有人能帮助我 (gcc 4.7.2,boost 1.59) 现在,我无法理解的是,为什么上面的代码无法编译,下面的代码无法编译,为什么从函数返回时会转换为bool if(func()) // optional actually exists 注意:我还注意到IsValidTest()在visual studio上没有给出任何编译错误 任何备受赞赏的帮助都定义了一种价值观 explicit意味着编译器不会为您执行隐式转换,您必须指定要调用运算符 您使用了

我遇到了一个我无法解决的问题,希望有人能帮助我 (gcc 4.7.2,boost 1.59)

现在,我无法理解的是,为什么上面的代码无法编译,下面的代码无法编译,为什么从函数返回时会转换为
bool

 if(func())
  // optional actually exists 
注意:我还注意到
IsValidTest()
在visual studio上没有给出任何编译错误

任何备受赞赏的帮助都定义了一种价值观

explicit
意味着编译器不会为您执行隐式转换,您必须指定要调用运算符

您使用了
,但您也可以使用
static\u cast()
。它适用于
if
,因为
if
语句有关于
运算符bool
的特殊规则,即在计算表达式时忽略
显式
标识符。

解决方案是使用

return !!func();
return !!func();
否。显式地将
可选
转换为
bool
只需检查是否存在值,即是否为空。这是通过显式操作符bool()
实现的,与iostream非常相似

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

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


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

boost::optional应该可以转换为两个bool,我认为这是不明确的。您必须使用旧版本的M$VS,不支持显式
关键字。是的,我在使用Visual Studio 2012Re“它适用于
if
,因为
if
语句需要
bool
”,不,它适用于
if
,因为
if
需要一个条件,这对
显式运算符bool()
有一个特殊的规则。例如,仅将
可选的
直接用作
bool
变量的初始值设定项将不起作用。我不太理解您的观点,即“仅将可选的直接用作bool变量的初始值设定项将不起作用”您能给出一个建议吗example@BubbleBoy我的解释有点错误。它说这个
bool b=returnOptional()可以工作,但它确实可以not@BubbleBoy:
bool b=some_可选无法编译。此上下文需要
bool
值,但没有到
bool
的隐式转换。需要
bool
值的上下文不足以触发
显式转换。
 if(func())
  // optional actually exists 
return !!func();