@R'nin bu cevabı. Martinho Fernandes , güvenli bool deyiminin görünüşte C ++ 11'de kullanımdan kaldırıldığını, çünkü basit bir
explicit operator bool() const;
cevap standart alıntı göre §4 [conv] p3
:
Bir ifade e, ancak icat edilen bazı geçici değişkenler için
T
ve ancak deklarasyonT t=e;
iyi oluşturulmuşsa örtülü olarak bir türe dönüştürülebilirt
(§8.5). Bazı dil yapıları, bir ifadenin Boole değerine dönüştürülmesini gerektirir. Bir ifadee
Böyle bir bağlamda ortaya olduğu söylenen , içeriğe dönüştürülen içinbool
ve iyi oluşturulmuş ise ve bu bildiri, yalnızcabool t(e);
iyi oluşturulur bazı icat geçici değişken t (§8.5) dir.
Vurgulanan kısım açıkça "örtük açık döküm" (standartta "bağlamsal dönüşüm" olarak adlandırılır) @R olarak açıkça gösterilir. Martinho koydu.
"Örtük açık döküm" gerektiren "belirli dil yapıları" aşağıdaki gibi görünür:
if
,while
,for
(§6.4 [stmt.select] p4
)- ikili mantıksal işleçler
&&
ve||
(§5.14 [expr.log.and/or] p1
her ikisi için) - mantıksal olumsuzlama operatörü
!
(§5.3.1 [expr.unary.op] p9
) - koşullu işleç
?:
(§5.14 [expr.cond] p1
) static_assert
(§7 [dcl.dcl] p4
)noexcept
(§15.4 [except.spec] p2
)
Başlıktaki varsayımımız doğru mu? Umarım olası bir dezavantajı görmezden gelmedik.
operator bool
. Örneğin, shared_ptr
p adlı bir üyem varsa ve bu yöntemi varsa:, operator bool() const { return p; }
derlemek başarısız olur. Bu aptal IMO.