"क्या है के रूप में यदि " नियम?
" As-if " नियम मूल रूप से परिभाषित करता है कि एक कानूनी C ++ प्रोग्राम पर कार्यान्वयन के लिए किन परिवर्तनों को अनुमति दी जाती है। संक्षेप में, सभी परिवर्तनों को जो एक कार्यक्रम के " अवलोकनीय व्यवहार " को प्रभावित नहीं करते हैं (सटीक परिभाषा के लिए नीचे देखें) की अनुमति है।
लक्ष्य कार्यान्वयन को स्वतंत्रता प्रदान करना है जब तक कि कार्यक्रम का व्यवहार एक सार मशीन के संदर्भ में C ++ मानक द्वारा निर्दिष्ट शब्दार्थ के अनुरूप हो।
मानक इस नियम को कहाँ प्रस्तुत करता है?
C ++ 11 मानक पैराग्राफ 1.9 / 1 में " as-if " नियम का परिचय देता है :
इस अंतर्राष्ट्रीय मानक में शब्दार्थ विवरण एक मानकीकृत नॉन्डेटेरमिनिस्टिक अमूर्त मशीन को परिभाषित करते हैं। यह अंतर्राष्ट्रीय मानक अनुरूप कार्यान्वयन की संरचना पर कोई आवश्यकता नहीं रखता है। विशेष रूप से, उन्हें अमूर्त मशीन की संरचना की नकल या अनुकरण करने की आवश्यकता नहीं है। बल्कि, नीचे दिए गए अनुसार अमूर्त मशीन के अवलोकन योग्य व्यवहार (केवल) का अनुकरण करने के लिए अनुरूपण कार्यान्वयन की आवश्यकता होती है ।
इसके अलावा, एक व्याख्यात्मक फुटनोट कहते हैं:
इस प्रावधान को कभी-कभी "जैसा-अगर" नियम कहा जाता है , क्योंकि एक कार्यान्वयन इस अंतर्राष्ट्रीय मानक की किसी भी आवश्यकता की अवहेलना करने के लिए स्वतंत्र है, जब तक कि परिणाम ऐसा हो, जब तक कि आवश्यकता का पालन किया गया था, जहां तक कि अवलोकन योग्य व्यवहार से निर्धारित किया जा सकता है। कार्यक्रम का। उदाहरण के लिए, एक वास्तविक क्रियान्वयन को किसी अभिव्यक्ति के भाग का मूल्यांकन करने की आवश्यकता नहीं है यदि वह यह मान सकता है कि उसके मूल्य का उपयोग नहीं किया गया है और यह कि कार्यक्रम के अवलोकन व्यवहार को प्रभावित करने वाले कोई दुष्प्रभाव उत्पन्न नहीं होते हैं।
नियम क्या कहता है?
पैराग्राफ 1.9 / 5 आगे निर्दिष्ट करता है:
एक अच्छी तरह से गठित कार्यक्रम को क्रियान्वित करने वाला एक अनुरूप कार्यान्वयन एक ही कार्यक्रम और एक ही इनपुट के साथ अमूर्त मशीन के संबंधित उदाहरण के संभावित निष्पादन में से एक के रूप में एक ही नमूदार व्यवहार का उत्पादन करेगा । हालाँकि, यदि इस तरह के किसी भी निष्पादन में एक अपरिभाषित ऑपरेशन होता है, तो यह अंतर्राष्ट्रीय मानक उस इनपुट के साथ उस प्रोग्राम को निष्पादित करने वाले कार्यान्वयन पर कोई आवश्यकता नहीं रखता है (पहले अपरिभाषित ऑपरेशन से पहले संचालन के संबंध में भी नहीं)।
यह ध्यान देने योग्य है कि यह बाधा तब लागू होती है जब " केवल एक सुव्यवस्थित कार्यक्रम का निष्पादन" किया जाता है, और यह कि ऐसे कार्यक्रम को निष्पादित करने के संभावित परिणाम जिनमें अपरिभाषित व्यवहार शामिल नहीं हैं, अप्रतिबंधित हैं। इसे पैरा 1.9 / 4 में भी स्पष्ट किया गया है:
इस अंतर्राष्ट्रीय मानक में कुछ अन्य परिचालनों को अपरिभाषित (उदाहरण के लिए, एक कास्ट ऑब्जेक्ट को संशोधित करने के प्रयास का प्रभाव) के रूप में वर्णित किया गया है। [नोट: यह अंतर्राष्ट्रीय मानक उन कार्यक्रमों के व्यवहार पर कोई आवश्यकता नहीं लगाता है जिनमें अपरिभाषित व्यवहार होता है । ध्यान दें]
अंत में, " अवलोकनीय व्यवहार " की परिभाषा के विषय में , पैरा 1.9 / 8 इस प्रकार है:
एक अनुरूप कार्यान्वयन पर सबसे कम आवश्यकताएं हैं:
- अमूर्त मशीन के नियमों के अनुसार अस्थिर वस्तुओं तक पहुंच का कड़ाई से मूल्यांकन किया जाता है।
- कार्यक्रम समाप्ति पर, फाइलों में लिखे गए सभी डेटा संभावित परिणामों में से एक के समान होंगे जो अमूर्त शब्दार्थ के अनुसार कार्यक्रम का निष्पादन करेंगे।
- इंटरेक्टिव उपकरणों के इनपुट और आउटपुट डायनामिक्स इस तरह से घटित होंगे कि इनपुट के लिए प्रोग्राम का इंतजार करने से पहले आउटपुट को संकेत दिया जाता है। एक इंटरैक्टिव डिवाइस का गठन कार्यान्वयन-परिभाषित है।
इन्हें सामूहिक रूप से कार्यक्रम के अवलोकन योग्य व्यवहार के रूप में जाना जाता है । [ नोट : अमूर्त और वास्तविक शब्दार्थ के बीच अधिक कड़े पत्राचार को प्रत्येक कार्यान्वयन द्वारा परिभाषित किया जा सकता है। - अंतिम नोट ]
क्या ऐसी परिस्थितियां हैं जहां यह नियम लागू नहीं होता है?
मेरे ज्ञान का सबसे अच्छा करने के लिए, "के रूप में- if " नियम का एकमात्र अपवाद कॉपी / मूव एलिसन है, जिसकी अनुमति है भले ही कॉपी कंस्ट्रक्टर, मूव कंस्ट्रक्टर, या क्लास के डिस्ट्रक्टर के साइड इफेक्ट्स हों। इसके लिए सटीक शर्तें अनुच्छेद 12.8 / 31 में निर्दिष्ट हैं:
जब कुछ मानदंडों को पूरा किया जाता है, तो एक कार्यान्वयन को किसी वर्ग ऑब्जेक्ट की प्रतिलिपि / चाल निर्माण को छोड़ देने की अनुमति दी जाती है, भले ही निर्माणकर्ता को कॉपी / मूव ऑपरेशन के लिए चुना गया हो और / या ऑब्जेक्ट के लिए विध्वंसक के दुष्प्रभाव हों । [...]