Этот ответ @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; }
он не скомпилируется. Это глупо ИМО.