2016-01-20 74 views
3

我正在閱讀一些代碼,我遇到了一些我不明白的東西。 它關於測試Boost :: optional值是否被初始化。它使用提供了宏的ASSERT_TRUE()的gtest框架。Boost可選隱式轉換爲bool?

#include "gtest\gtest.h" 

void test() { 
    boost::optional<someClass> opt = someFunc(); 
    ASSERT_TRUE(!!opt); 
} 

爲什麼需要opt!!?是不是一個boost::optional不會隱式轉換爲宏,這是宏需要?我認爲使用ASSERT_TRUE(opt)來檢查opt是否具有正確的值就足夠了?

回答

7

是一個boost::optional不impicit轉換爲布爾

不,不是這樣的。其轉換運算符爲bool標記爲explicit,但您的測試框架需要可隱式轉換的內容。你也應該看到這個問題:bool test = opt;也是如此:應該編譯失敗。

+0

我明白了,但是如果我閱讀這篇文章的權利:http://stackoverflow.com/questions/4923384/conversion-of-boostoptional-to-bool,它是隱式轉換?這有改變嗎? – Ventu

+3

@Suv if(my_optional)'即使轉換運算符爲「explicit」,也會編譯,因爲這是[上下文轉換](http://en.cppreference.com/w/cpp/language/implicit_cast#Contextual_conversions)。另外,根據Boost的版本以及你是否啓用了C++ 11等,'optional'可以使用安全bool idiom進行bool轉換,這也是一種隱式轉換,但是可以防止編譯一些有問題的用途。 – Praetorian

相關問題