Этот ответ @R. Мартиньо Фернандес показывает, что идиома безопасного булла в C ++ 11 явно устарела, так как ее можно заменить простым
explicit operator bool() const;
согласно стандартной цитате в ответе §4 [conv] p3:
Выражение e может быть неявно преобразовано в тип
Tтогда и только тогда, когда объявлениеT t=e;правильно сформировано, для некоторой изобретенной временной переменнойt(§8.5). Некоторые языковые конструкции требуют, чтобы выражение было преобразовано в логическое значение. Выражениеeпоявляется в таком контексте , как говорит, контекстуально преобразовано вboolи хорошо сформировано , если и только если декларацияbool t(e);хорошо сформирована , в течение некоторого изобретенный временного переменного т (§8.5).
Выделенная часть ясно показывает «неявное явное приведение» (в стандарте называемое «контекстное преобразование») как @R. Мартиньо положил это
«Определенные языковые конструкции», которые требуют «неявного явного приведения», выглядят следующим образом:
if,while,for(§6.4 [stmt.select] p4)- двоичные логические операторы
&&и||(§5.14 [expr.log.and/or] p1для обоих) - оператор логического отрицания
!(§5.3.1 [expr.unary.op] p9) - условный оператор
?:(§5.14 [expr.cond] p1) static_assert(§7 [dcl.dcl] p4)noexcept(§15.4 [except.spec] p2)
Правильно ли наше предположение в названии? Надеюсь, мы не упустили ни одного потенциального недостатка.
operator bool. Например, если у меня есть shared_ptrчлен с именем p и у меня есть этот метод:, operator bool() const { return p; }он не скомпилируется. Это глупо ИМО.