Ta odpowiedź @R. Martinho Fernandes pokazuje, że idiom bezpieczny jest przestarzały w C ++ 11, ponieważ można go zastąpić prostym
explicit operator bool() const;
zgodnie ze standardowym cytatem w odpowiedzi §4 [conv] p3
:
Wyrażenie e można domyślnie przekonwertować na typ
T
wtedy i tylko wtedy, gdy deklaracjaT t=e;
jest poprawnie sformułowana, dla niektórych wynalezionych zmiennych tymczasowycht
(§ 8.5). Niektóre konstrukcje językowe wymagają przekonwertowania wyrażenia na wartość logiczną. Wyrażeniee
występujące w takim kontekście mówi się, że jest kontekstowo konwertowane nabool
i jest dobrze uformowane, jeśli i tylko jeśli deklaracjabool t(e);
jest dobrze uformowana , dla niektórych wynalezionych zmiennych tymczasowych t (§ 8.5).
Podświetlona część wyraźnie pokazuje „domyślną jawną obsadę” (zwaną w standardzie „konwersją kontekstową”) jako @R. Martinho to ujął.
„Niektóre konstrukcje językowe”, które wymagają, aby „jawna obsada jawna” wyglądała następująco:
if
,while
,for
(§6.4 [stmt.select] p4
)- binarne operatory logiczne
&&
i||
(§5.14 [expr.log.and/or] p1
dla obu) - operator logicznej negacji
!
(§5.3.1 [expr.unary.op] p9
) - operator warunkowy
?:
(§5.14 [expr.cond] p1
) static_assert
(§7 [dcl.dcl] p4
)noexcept
(§15.4 [except.spec] p2
)
Czy nasze założenie w tytule jest prawidłowe? Mam nadzieję, że nie przeoczyliśmy żadnych potencjalnych wad.
operator bool
. Na przykład, jeśli mam shared_ptr
członka o nazwie p i mam tę metodę: operator bool() const { return p; }
kompilacja nie powiedzie się. To głupie IMO.