[conv]/4 से असहमत:[expr.unary.op]/9 यह इंगित करता है कि `ऑपरेटर!()` नीचे दिए गए प्रकार ए पर लागू नहीं किया जा सका। लेकिन compilers कि
कुछ भाषा निर्माणों की आवश्यकता है कि एक अभिव्यक्ति एक बूलियन मान के लिए परिवर्तित किया जा। एक अभिव्यक्ति
e
इस तरह के एक संदर्भ में प्रदर्शित होने कहा प्रासंगिक रूपbool
में बदला और अच्छी तरह से बनाई है, तो और केवल तभी घोषणाbool t(e);
अच्छी तरह से बनाई है, कुछ का आविष्कार किया अस्थायी चरt
(11.6) के लिए माना जाता है।
अब नीचे स्निपेट पर विचार करें। यह संकलित नहीं करता है, न तो clang, GCC या VS में।
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}
इस प्रकार, से [रूपा]/4 हम निष्कर्ष है कि प्रकार A
प्रासंगिक रूप bool
में परिवर्तित नहीं है।
तार्किक निषेध ऑपरेटर
!
के संकार्य प्रासंगिक रूपbool
में बदल जाती है (खण्ड 7); इसका मानtrue
है यदि परिवर्तित ऑपरेंडfalse
औरfalse
अन्यथा है। परिणाम का प्रकारbool
है।
अनुच्छेद के मेरे समझ से ऊपर है कि तार्किक निषेध ऑपरेटर !
के संकार्य प्रासंगिक रूप bool
परिवर्तित किया जाना चाहिए है। हमने अभी निष्कर्ष निकाला है कि A
संदर्भित रूप से bool
में परिवर्तित हो गया है। इसलिए, [expr.unary.op]/9 से, हम कह सकते हैं कि निम्न कोड संकलित नहीं होना चाहिए। लेकिन यह clang, GCC और VS में करता है।
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t = !a;
}
मुझे क्या याद आ रही है?
यह एक तार्किक अस्वीकरण ऑपरेटर नहीं है, इसका सदस्य 'ए :: ऑपरेटर!' कार्य करता है, वैसे भी मेरा अनुमान है। मेरा मानना है कि यह 'ऑपरेटर' के साथ एक ही बात है, कॉमा ऑपरेटर के पास ओवरलोड के बिना भी एक अंतर्निहित अर्थ है, लेकिन एक अधिभार –
के साथ प्रदान किए जाने पर अच्छी तरह से परिभाषित किया गया है 'बूल टी (ए);' टू 'बूल टी (ए); 'आपके पहले उदाहरण में। कंपाइलर अनुमान लगा सकता है कि इसे 'ऑपरेटर' लागू करने की आवश्यकता है। –
[खंड \ [expr \] ऑपरेटर के प्रभाव को परिभाषित करता है जब उन प्रकारों पर लागू होता है जिनके लिए उन्हें ओवरलोड नहीं किया गया है।] (Http://eel.is/c++draft/expr#3.sentence-1) – cpplearner