我遇到了一个我无法弄清楚的问题,希望有人可以提供帮助 (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上出现任何编译错误
任何帮助非常感谢
答案 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
为空的情况下,您必须决定所需的值。