這可能是雙重伎倆的示例,請參閱The Safe Bool Idiom瞭解更多詳情。這裏我總結了文章的第一頁。
在C++中有很多方法可以爲類提供布爾測試。
一個明顯的方法是operator bool
轉換運算符。
// operator bool version
class Testable {
bool ok_;
public:
explicit Testable(bool b=true):ok_(b) {}
operator bool() const { // use bool conversion operator
return ok_;
}
};
我們可以測試類,
Testable test;
if (test)
std::cout << "Yes, test is working!\n";
else
std::cout << "No, test is not working!\n";
然而,opereator bool
被認爲是不安全的,因爲它允許無意義的操作,如test << 1;
或int i=test
。
使用operator!
更安全是因爲我們避免了隱式轉換或重載問題。
實現很簡單,
bool operator!() const { // use operator!
return !ok_;
}
兩個慣用的方法來測試Testable
對象是
Testable test;
if (!!test)
std::cout << "Yes, test is working!\n";
if (!test2) {
std::cout << "No, test2 is not working!\n";
第一個版本if (!!test)
就是一些人所說的雙響招 。
來源
2016-10-12 14:53:46
sam
此主題已經被討論[這裏](http://stackoverflow.com/questions/206106/is-a-safe-way-to-convert-to-bool-in-c#206122)。 – Dima 2008-10-30 14:01:33
在這裏檢查,已經問過,[是!一個安全的方式來轉換爲C++布爾?](http://stackoverflow.com/questions/206106/is-a-safe-way-to-convert-to-bool-in-c) – 2008-10-29 22:52:17
可能重複[Is !一個安全的方式來轉換爲C++布爾?](https://stackoverflow.com/questions/206106/is-a-safe-way-to-convert-to-bool-in-c) – EdChum 2017-12-04 16:46:34