这可能是双重爆炸技巧的示例,请参阅《安全布尔成语》有关更多详细信息 ”。在这里,我总结了文章的第一页。
在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)
被某些人称为“ 双爆炸”把戏。