Boost可选隐式转换为bool?

Ven*_*ntu 4 c++ boost googletest boost-optional

我正在读一些代码而且我遇到了一些我不理解的东西.它是关于测试是否初始化Boost :: optional值.它使用提供ASSERT_TRUE()宏的gtest框架.

#include "gtest\gtest.h"

void test() {
    boost::optional<someClass> opt = someFunc();
    ASSERT_TRUE(!!opt);
}
Run Code Online (Sandbox Code Playgroud)

为什么我需要!!之前的opt?是boost::optional不是隐式转换为bool,这是宏所需要的?我认为用它ASSERT_TRUE(opt)来检查opt是否保持正确值是足够的吗?

小智 8

boost::optional不是有义务转换为布尔

不,这不对.它的转换运算符bool已标记explicit,但您的测试框架需要可隐式转换的内容.你也应该看到普通问题bool test = opt;:它应该无法编译.

  • @Suv`if(my_optional)`即使转换运算符是`explicit`也会编译,因为它是[contextual conversion](http://en.cppreference.com/w/cpp/language/implicit_cast#Contextual_conversions).此外,根据Boost的版本以及是否启用了c ++ 11等,`optional`可能会使用安全bool习惯用于bool转换,这也是一种隐式转换,但是会阻止某些可疑用途的编译. (4认同)