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
Twtedy 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żenieewystępujące w takim kontekście mówi się, że jest kontekstowo konwertowane nabooli 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] p1dla 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_ptrczłonka o nazwie p i mam tę metodę: operator bool() const { return p; }kompilacja nie powiedzie się. To głupie IMO.