Это старый трюк, позволяющий избежать проблем с неявными преобразованиями в bool
до того, как в C ++ 11 были введены explicit
контекстные преобразования.Он предназначен для проверки правильности:
Subscriber my_subscriber = someFunction();
if (!my_subscriber) {
// error case
}
Важным моментом является то, что не существует встроенного преобразования из void*
в целочисленные типы, но существует одно из bool
в целочисленные типы.В то же время существует встроенное преобразование из void*
в bool
.Это означает, что если вы определяете неявное преобразование в bool
, то удивительно верно следующее:
void my_func(int i);
void another_func() {
Subscriber sub = something();
my_func(sub);
}
Определение преобразования в void*
позволяет избежать этой проблемы.
В наши дни этот трюк устарел.C ++ 11 ввел explicit
преобразований.explicit
преобразования в bool
рассматриваются в условиях if
и циклов, но не рассматриваются в других проблемных случаях.Это означает, что в наши дни это преобразование должно быть записано как:
explicit operator bool() const { return impl_ && impl_->isValid(); }