@R का यह उत्तर। मार्टिनो फर्नांडीस से पता चलता है, कि सेफ-बूल मुहावरा C ++ 11 में स्पष्ट रूप से पदावनत है, क्योंकि इसे एक साधारण से बदला जा सकता है
explicit operator bool() const;
उत्तर में मानक बोली के अनुसार §4 [conv] p3
:
एक अभिव्यक्ति ई स्पष्ट रूप से एक प्रकार में परिवर्तित किया जा सकता है
T
अगर और केवल अगर घोषणाT t=e;
अच्छी तरह से बनाई गई है, कुछ आविष्कार अस्थायी चरt
(impl8.5) के लिए। कुछ भाषा निर्माणों को एक अभिव्यक्ति को बूलियन मान में बदलने की आवश्यकता होती है।e
इस तरह के संदर्भ में प्रकट होने वाली अभिव्यक्ति को प्रासंगिक रूप से परिवर्तित किया जाता हैbool
और इसे अच्छी तरह से बनाया जाता है, यदि केवल और केवल घोषणाbool t(e);
ही अच्छी तरह से बनती है , तो कुछ आविष्कृत अस्थायी चर टी (.58.5) के लिए।
हाइलाइट किया गया भाग स्पष्ट रूप से "निहित स्पष्ट कास्ट" (मानक में "प्रासंगिक रूपांतरण" कहा जाता है) @ आर के रूप में दिखाता है। मार्टिनो ने डाला।
"निश्चित भाषा निर्माण" के लिए आवश्यक है कि "निहित स्पष्ट कलाकार" निम्नलिखित प्रतीत हों:
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
सदस्य है जिसे पी कहा जाता है और यह विधि है: operator bool() const { return p; }
यह संकलन करने में विफल रहता है। वह मूर्ख IMO है।