Это может быть примером трюка двойного взрыва , для получения более подробной информации см. 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)
- это то, что некоторые люди называют трюком двойного взрыва .