2016-12-19 13 views
11

मैं http://en.cppreference.com/w/cpp/language/operators में पढ़ें:ओवरलोडेड ऑपरेटर का शॉर्ट सर्किट && और || में सी ++ 17

बूलियन तर्क ऑपरेटरों, ऑपरेटर & & और ऑपरेटर ||

के विपरीत बनाया-इन संस्करणों, भार के उनके बाएँ संकार्य सही से पहले क्रम नहीं है, और (सी ++ 17 तक) शॉर्ट सर्किट लागू नहीं कर सकते मूल्यांकन।

(मेरा जोर)।

ऑपरेटर & & और ऑपरेटर || के लिए सी ++ 17 सहायक शॉर्ट सर्किट के लिए कोई संसाधन या कोड उदाहरण नहीं मिला। क्या यह सी ++ 17 पैरामीटर पैक फोल्ड एक्सप्रेशन से संबंधित है? इसके साथ खेलने की कोशिश की लेकिन ओवरलोडेड ऑपरेटर & & और || के लिए शॉर्ट सर्किट व्यवहार नहीं बना सका सी ++ 17 गुना अभिव्यक्ति के साथ।

कोड:

class A { 
    bool val; 
public: 
    A(bool b) : val(b) { cout << "A born as " << boolalpha << val << endl;} 
    template<typename ...Args> 
    bool operator&&(Args&&... args) { 
     return (val && ... && args.val); 
    }  
}; 

int main() { 
    cout << boolalpha; 
    cout << (A{false} && A{true}) << endl; 
    cout << (A{true} && A{false}) << endl; 
    cout << (A{false} && A{false}) << endl; 
} 

आउटपुट:

A born as true 
A born as false 
false 
A born as false 
A born as true 
false 
A born as false 
A born as false 
false 

http://coliru.stacked-crooked.com/a/f0b5325899c2fe6b

नोट: के अनुक्रम बाएं से दाएं भी वर्तमान जीसीसी संस्करण में नहीं हो रहा है, के साथ संकलित सी ++ 17 झंडा।

+0

कृपया दिखाएं कि आपने क्या प्रयास किया है जो काम नहीं करता है। शायद आप इस्तेमाल किए गए कंपाइलर और संस्करण का चयन कर सकते हैं [यहां] (https://godbolt.org/) और लिंक पोस्ट करें। – wally

+0

* शॉर्ट सर्किट व्यवहार नहीं बना सका * त्रुटि क्या थी? या क्या कोई त्रुटि नहीं थी और आपके साइड इफेक्ट्स थे जो डाउनस्ट्रीम ऑपरेटरों के लिए खुद को प्रदर्शित करते थे? या आपने कोड के माध्यम से कदम रखा और यह अन्य ऑपरेटरों में कदम रखा? – wally

+1

@Mus प्रश्न मानक में परिभाषित व्यवहार के बारे में है, न कि कोड जो काम नहीं करता है। – interjay

उत्तर

10

यह कथन शॉर्ट-सर्किट मूल्यांकन के बारे में नहीं है। यह ऑपरेटरों का मूल्यांकन करने के आदेश के बारे में है।

प्री-सी ++ 17, अधिभारित ऑपरेटरों के मूल्यांकन के लिए आदेश & & और || संकलक परिभाषित किया गया था। सी ++ 17 & & और || के लिए बाएं से दाएं के मूल्यांकन के एक स्पष्ट क्रम को परिभाषित करता है, चाहे वे अधिभारित हों या नहीं।

शॉर्ट सर्किट मूल्यांकन अभी भी अंतर्निहित ऑपरेटरों पर लागू होता है।

ध्यान दें कि आपके द्वारा उद्धृत वास्तविक पृष्ठ पर, जो भाग हाइलाइट किया गया है वह एक विशिष्ट संस्करण पर लागू होता है। वह हिस्सा अनुक्रमिक आदेश के बारे में है, शॉर्ट-सर्किट मूल्यांकन के बारे में नहीं।

+3

यह दुर्भाग्यपूर्ण प्लेसमेंट है "सी ++ 17" टैग तक। मैंने व्याकरण को स्पष्ट बनाने के लिए पृष्ठ संपादित किया है। – user2357112

+4

@ user2357112: व्यक्तिगत रूप से, यह तब तक ठीक लगता है जब आप जानते हैं कि सभी संस्करण-विशिष्ट टैग केवल उस बॉक्स में टेक्स्ट पर लागू होते हैं। –

+0

बेशक, सभी को यह नहीं पता है, और अंग्रेजी व्याकरण और संस्करण-बॉक्स के बीच विसंगति अभी भी किसी को फेंक सकती है जो जानता है कि संस्करण-बक्से कैसे काम करते हैं। – user2357112

संबंधित मुद्दे