boost :: optional返回bool值并不总是有效

时间:2016-07-29 00:40:44

标签: c++ boost

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

r1 <- aggregate(cbind(Count=days)~id, df1, length)
r1[order(-r1$Count),]
#      id Count
#2  jdkl     3
#3 mnoap     2
#1  aowl     1

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

bool IsValidTest(int val) const
{
   if(val > 0)
       return func(); // func() returns boost::optional<SomeType>;
}
我确实看到了!运营商存在,所以解决方案是使用

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

现在,我无法弄清楚为什么上面的内容将无法编译,以下内容为什么在从函数返回时转换为return !!func(); 的问题

bool

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

任何帮助非常感谢

2 个答案:

答案 0 :(得分:3)

boost::optional定义了explicit operator bool

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

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

答案 1 :(得分:1)

关于

  

解决方案是使用

return !!func();

否。明确将optional转换为bool只会检查是否存在值,即它是否为空。这是通过explicit operator bool(),与iostream非常相似。

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

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

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