กฎ " as-if " คืออะไร?
โดยพื้นฐานแล้วกฎ" as-if " จะกำหนดว่าการเปลี่ยนแปลงใดที่การใช้งานได้รับอนุญาตให้ดำเนินการในโปรแกรม C ++ ตามกฎหมาย ในระยะสั้นการเปลี่ยนแปลงทั้งหมดที่ไม่ส่งผลกระทบต่อ " พฤติกรรมที่สังเกตได้ " ของโปรแกรม(ดูคำจำกัดความที่ชัดเจนด้านล่าง) ได้รับอนุญาต
เป้าหมายคือเพื่อให้การใช้งานมีอิสระในการดำเนินการปรับให้เหมาะสมตราบเท่าที่พฤติกรรมของโปรแกรมยังคงเป็นไปตามความหมายที่กำหนดโดยมาตรฐาน C ++ ในแง่ของเครื่องจักรนามธรรม
มาตรฐานแนะนำกฎนี้ที่ไหน
มาตรฐาน C ++ 11 แนะนำกฎ " as-if " ในย่อหน้า 1.9 / 1:
คำอธิบายความหมายในมาตรฐานสากลนี้กำหนดเครื่องนามธรรมที่ไม่กำหนดพารามิเตอร์ มาตรฐานสากลฉบับนี้ไม่มีข้อกำหนดเกี่ยวกับโครงสร้างของการปฏิบัติตามการนำไปใช้ โดยเฉพาะอย่างยิ่งพวกเขาไม่จำเป็นต้องคัดลอกหรือเลียนแบบโครงสร้างของเครื่องจักรที่เป็นนามธรรม แต่การใช้งานที่สอดคล้องกันนั้นจำเป็นต้องเลียนแบบ (เท่านั้น) พฤติกรรมที่สังเกตได้ของเครื่องจักรนามธรรมตามที่อธิบายไว้ด้านล่าง
นอกจากนี้เชิงอรรถอธิบายเพิ่มเติม:
ข้อกำหนดนี้บางครั้งเรียกว่ากฎ“ as-if”เนื่องจากการนำไปใช้มีอิสระที่จะเพิกเฉยต่อข้อกำหนดใด ๆ ของมาตรฐานสากลนี้ตราบใดที่ผลลัพธ์เป็นไปราวกับว่าข้อกำหนดนั้นได้รับการปฏิบัติตามเท่าที่สามารถกำหนดได้จากพฤติกรรมที่สังเกตได้ ของโปรแกรม ตัวอย่างเช่นการนำไปใช้งานจริงไม่จำเป็นต้องประเมินส่วนหนึ่งของนิพจน์หากสามารถอนุมานได้ว่าไม่ได้ใช้ค่าของมันและไม่มีผลข้างเคียงที่ส่งผลต่อพฤติกรรมที่สังเกตได้ของโปรแกรม
กฎบังคับว่าอย่างไร?
ย่อหน้าที่ 1.9 / 5 ระบุเพิ่มเติม:
การดำเนินไปตามกลไกการรันโปรแกรมรูปแบบที่ดีต้องแสดงพฤติกรรมที่สังเกตได้เช่นเดียวกับหนึ่งในการประหารชีวิตเป็นไปได้ของอินสแตนซ์ที่สอดคล้องกันของเครื่องนามธรรมกับโปรแกรมเดียวกันและการป้อนข้อมูลเดียวกัน อย่างไรก็ตามหากการดำเนินการดังกล่าวมีการดำเนินการที่ไม่ได้กำหนดมาตรฐานสากลฉบับนี้ไม่ได้กำหนดข้อกำหนดใด ๆ เกี่ยวกับการดำเนินการตามโปรแกรมนั้นด้วยข้อมูลที่ป้อนเข้านั้น
เป็นเรื่องที่ควรค่าแก่การเน้นย้ำว่าข้อ จำกัด นี้มีผลเมื่อ"ดำเนินการโปรแกรมที่มีรูปแบบที่ดี"เท่านั้นและผลลัพธ์ที่เป็นไปได้ของการดำเนินการโปรแกรมที่มีพฤติกรรมที่ไม่ได้กำหนดนั้นไม่มีข้อ จำกัด มีการระบุไว้อย่างชัดเจนในย่อหน้าที่ 1.9 / 4 ด้วย:
การดำเนินการอื่น ๆ บางอย่างได้อธิบายไว้ในมาตรฐานสากลนี้ว่าไม่ได้กำหนดไว้ (ตัวอย่างเช่นผลของการพยายามแก้ไขวัตถุ const) [หมายเหตุ: มาตรฐานสากลนี้กำหนดความต้องการที่ไม่มีในลักษณะการทำงานของโปรแกรมที่มีพฤติกรรมที่ไม่ได้กำหนด - ส่งหมายเหตุ]
สุดท้ายเกี่ยวกับคำจำกัดความของ " พฤติกรรมที่สังเกตได้ " ย่อหน้าที่ 1.9 / 8 มีดังนี้:
ข้อกำหนดขั้นต่ำสำหรับการนำไปใช้งานที่สอดคล้องคือ:
- การเข้าถึงวัตถุระเหยได้รับการประเมินอย่างเคร่งครัดตามกฎของเครื่องจักรนามธรรม
- เมื่อสิ้นสุดโปรแกรมข้อมูลทั้งหมดที่เขียนลงในไฟล์จะต้องเหมือนกับหนึ่งในผลลัพธ์ที่เป็นไปได้ที่การดำเนินการของโปรแกรมตามความหมายนามธรรมจะได้รับ
- พลวัตอินพุตและเอาต์พุตของอุปกรณ์อินเทอร์แอกทีฟจะเกิดขึ้นในรูปแบบที่แจ้งเอาต์พุตจริงก่อนที่โปรแกรมจะรออินพุต สิ่งที่ประกอบเป็นอุปกรณ์โต้ตอบคือการกำหนดการนำไปใช้งาน
เหล่านี้รวมกันจะเรียกว่าเป็นพฤติกรรมที่สังเกตได้ของโปรแกรม [ หมายเหตุ : การโต้ตอบที่เข้มงวดมากขึ้นระหว่างความหมายนามธรรมและความหมายที่แท้จริงอาจถูกกำหนดโดยการนำไปใช้ - หมายเหตุ ]
มีสถานการณ์ที่กฎนี้ใช้ไม่ได้หรือไม่?
จากความรู้ของฉันอย่างดีที่สุดข้อยกเว้นเดียวของกฎ " as-if " คือ copy / move elision ซึ่งได้รับอนุญาตแม้ว่าตัวสร้างการคัดลอกตัวสร้างการย้ายหรือตัวทำลายชั้นเรียนจะมีผลข้างเคียง เงื่อนไขที่แน่นอนสำหรับสิ่งนี้ระบุไว้ในย่อหน้าที่ 12.8 / 31:
เมื่อเกณฑ์ที่แน่นอนจะได้พบกับการดำเนินการที่ได้รับอนุญาตที่จะละเว้นการก่อสร้างคัดลอก / ย้ายของวัตถุชั้นแม้ว่าสร้างเลือกสำหรับการดำเนินการคัดลอก / ย้ายและ / หรือ destructor สำหรับวัตถุที่มีผลข้างเคียง [... ]