" Sanki " kuralı nedir?
" As-eğer " temelde bir uygulama yasal bir C ++ programı gerçekleştirmek için izin verildiğini dönüşümler tanımlarınızı kural. Kısaca, bir programın " gözlemlenebilir davranışını " etkilemeyen tüm dönüşümlere (kesin bir tanım için aşağıya bakın) izin verilir.
Amaç, programın davranışı C ++ Standardı tarafından soyut bir makine açısından belirtilen semantiğe uygun kaldığı sürece uygulamalara optimizasyonları gerçekleştirme özgürlüğü vermektir.
Standart bu kuralı nerede sunar?
C ++ 11 Standardı , Paragraf 1.9 / 1'de " olduğu gibi " kuralını getirmektedir:
Bu Uluslararası Standarttaki anlamsal açıklamalar, parametreleştirilmiş belirleyici olmayan bir soyut makineyi tanımlar. Bu Uluslararası Standart, uyumlu uygulamaların yapısına herhangi bir gereklilik getirmez. Özellikle, soyut makinenin yapısını kopyalamaları veya taklit etmeleri gerekmez. Daha ziyade, uyumlu uygulamaların, aşağıda açıklandığı gibi soyut makinenin gözlemlenebilir davranışını taklit etmesi (sadece) gereklidir .
Ayrıca açıklayıcı bir dipnot şunları ekler:
Bu hüküm bazen "olduğu gibi" kuralı olarak adlandırılır , çünkü bir uygulama, gözlemlenebilir davranıştan tespit edilebildiği sürece, sonuç, gerekliliğe uyulmuş gibi olduğu sürece, bu Uluslararası Standardın herhangi bir gerekliliğini göz ardı etmekte serbesttir. programın. Örneğin, gerçek bir uygulamanın, değerinin kullanılmadığını ve programın gözlemlenebilir davranışını etkileyen hiçbir yan etkinin üretilmediğini anlayabiliyorsa, ifadenin bir kısmını değerlendirmesine gerek yoktur.
Kural tam olarak neyi zorunlu kılıyor?
1.9 / 5 paragrafı ayrıca şunları belirtir:
İyi biçimlendirilmiş bir programı yürüten uygun bir uygulama , aynı program ve aynı girdiyle soyut makinenin karşılık gelen örneğinin olası yürütmelerinden biri ile aynı gözlemlenebilir davranışı üretecektir . Bununla birlikte, bu tür bir yürütme tanımlanmamış bir işlem içeriyorsa, bu Uluslararası Standart, bu programı bu girdi ile yürüten uygulamaya herhangi bir gereklilik getirmez (ilk tanımsız işlemden önceki işlemlerle ilgili olarak bile).
Bu kısıtlamanın sadece "iyi biçimlendirilmiş bir program çalıştırılırken" geçerli olduğunu ve tanımsız davranış içeren bir programın çalıştırılmasının olası sonuçlarının kısıtlanmamış olduğunu vurgulamak gerekir . Bu, Paragraf 1.9 / 4'te de açıklanmıştır:
Bazı diğer işlemler bu Uluslararası Standartta tanımsız olarak tanımlanmıştır (örneğin, bir const nesnesini değiştirmeye çalışmanın etkisi). [Not: Bu Uluslararası Standart, tanımlanmamış davranışlar içeren programların davranışına herhangi bir gereklilik getirmez . - notu gönder]
Son olarak, " gözlemlenebilir davranış " tanımıyla ilgili olarak, Paragraf 1.9 / 8 aşağıdaki gibidir:
Uygun bir uygulama için en az gereksinimler şunlardır:
- Uçucu nesnelere erişim kesinlikle soyut makinenin kurallarına göre değerlendirilir.
- Programın sonlandırılmasında, dosyalara yazılan tüm veriler, programın soyut semantiğe göre çalıştırılmasının yaratacağı olası sonuçlardan biriyle aynı olacaktır.
- Etkileşimli cihazların girdi ve çıktı dinamikleri, bir program girdi beklemeden önce yönlendirici çıktı gerçekten iletilecek şekilde gerçekleşecektir. Etkileşimli bir cihazı oluşturan şey, uygulama tanımlıdır.
Bunlara topluca programın gözlemlenebilir davranışı denir . [ Not : Soyut ve gerçek anlambilim arasında daha sıkı yazışmalar her uygulama tarafından tanımlanabilir. - son not ]
Bu kuralın geçerli olmadığı durumlar var mı?
Bildiğim kadarıyla, " olduğu gibi " kuralının tek istisnası , bir sınıfın kopya yapıcısı, hareket kurucusu veya yıkıcısı yan etkilere sahip olmasına rağmen izin verilen kopyala / taşı seçmesidir. Bunun kesin koşulları Paragraf 12.8 / 31'de belirtilmiştir:
Belirli kriterler karşılandığında, kopyalama / taşıma işlemi için seçilen kurucu ve / veya nesne için yıkıcı yan etkilere sahip olsa bile , bir uygulamanın bir sınıf nesnesinin kopyalama / taşıma yapısını atlamasına izin verilir . [...]