Güvenli-bool deyim C ++ 11'de eski mi?


179

@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 Tve ancak deklarasyon T t=e;iyi oluşturulmuşsa örtülü olarak bir türe dönüştürülebilir t(§8.5). Bazı dil yapıları, bir ifadenin Boole değerine dönüştürülmesini gerektirir. Bir ifade eBöyle bir bağlamda ortaya olduğu söylenen , içeriğe dönüştürülen için boolve iyi oluşturulmuş ise ve bu bildiri, yalnızca bool 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] p1her 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.


30
+1: Yaklaşan standart hakkında yeni şeyler öğreten bu tür soruları seviyorum.
Björn Pollex

1
Standartta hangi örtülü açık kadronun eksik olduğunu biliyorsunuz ... başka bir şey döndürüyor operator bool. Örneğin, shared_ptrp adlı bir üyem varsa ve bu yöntemi varsa:, operator bool() const { return p; }derlemek başarısız olur. Bu aptal IMO.
David

Ne demek "implicit explicit" cast, @David?
Sz.

Yanıtlar:


128

Evet. Bu sadece örtük kullanıcı tanımlı dönüşümler ve açık kullanıcı tanımlı dönüşüm operatörleri pratik edildi sahip sorunlar için örnek çünkü bu sorunun icat ve bir şey çok daha temiz ve daha mantıklı olan tüm güvenli bool şeyler yerine.


-5

Ben buna "eski" demezdim. Henüz herkes C ++ 11'e ( 1 yaşında bile değil ) sıçramıyor. İyi miktarda kodlayıcı olsa bile, bu tür bir deyimin kütüphaneler için uygun programlardan daha mantıklı göründüğü göz önüne alındığında, kodu geriye doğru uyumlu tutma yeteneği bir zorunluluk olacaktır.


34
Tamamen C ++ 11'in varlığında konuşuyordum. Bu soru ne eski koda, geriye dönük uyumluluğa ne de C ++ 11 farkında derleyicilerine geçme isteksizliğine dokunmuyor. Ayrıca, C ++ 11'in kendi başına tamamen geriye doğru uyumlu olmadığını, kırılma değişiklikleri getirdiğini unutmayın.
Xeo

4
Bunu bilemezdim, üzgünüm. Sadece başlangıçta bağlantılı yanıtı düşünmedim, aynı zamanda sorunun [c ++] ve [c ++ - faq] olarak etiketlenmiş olması beni dilin her iki aşamasının değerlendirilmesinin önemli olduğunu düşündürdü .
Luis Machuca

1
Kesinlikle haklısın, bunu soruda açıkça belirtmedim. Bunu düzenleyeceğim, kafalar için teşekkürler.
Xeo

1
Bu cevap güncellemeyi gerçekten kullanabilir, şimdi yaklaşık iki yaşında.
Köpek yavrusu

1
Anlaşmazlıktan dolayı aşağı düşmem gerekecek, ama sana şahsen bir bira alıp "hey zor duygular" demeliyim. Ancak C ++ 11'deki birçok paradigma --std=c++0x, son çivi standart tabuta sürülmeden çok önce konuşlandırılıyor ve adı ISO spesifikasyonuna koymaya karar verdiler. Gerçekten derin bir şablon metaprogramlama bağımlısı değilseniz, C ++ 11 spesifikasyonunun detaylarının insanların ne kullandığına karşı sizin için hiçbir sonucu olmayacaktır ... bu da o zaman bile neredeyse tüm pratik amaçlar için 2011'den daha eski olduğu anlamına gelir. Ve şimdi,
saatime göre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.