这可能是双爆技巧的一个例子(有关更多详细信息,请参阅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";
}
但是,operator bool
它被认为是不安全的,因为它允许无意义的操作,例如test << 1;
or int i = test
。
使用operator!
更安全,因为我们避免了隐式转换或重载问题。
实现很简单,
bool operator!() const { // use operator!
return !ok_;
}
Testable
测试对象的两种惯用方法是
Testable test;
if (!!test) {
std::cout << "Yes, test is working!\n";
}
if (!test) {
std::cout << "No, test is not working!\n";
}
第一个版本if (!!test)
就是一些人所说的双爆技巧。