C ++ 26'da sözleşmeli son makalemdeki sözleşmelerin ayrıntılarını kısaca tanıttıktan sonra, sözleşmelerin derin bir görünümü, şimdi çok ilginç değerlendirmenin anlambilimine daha yakından bakmak istiyorum.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Bir sözleşme bir açıklama ise, değerlendirmenin dört semantiğinden biri kullanılır: ignore,, observe,, enforce VE quick-enforce. Tablo, dört anlambilime genel bir bakış sunuyor:

(Resim: Rainer Grimm)
Ne yazık ki, şu anda bu değerlendirmenin anlambilimini tam olarak görmek mümkün değildir.
Anlambilim ve terminal semantiğinin doğrulanması
Kontrol semantiği sadece sözleşme sistemini değerlendirirken, terminal semantiği de programı sona erdirir.
Bahsedilen dört değerlendirme semantiğinin tümü standart bir uyumluluk uygulaması uygulamamalıdır. Semantiğini de sunabilir.
görmezden gelmek
Adından da anlaşılacağı gibi, onu görmezden gelir ignore-Bar yüklem değerlendirmesi. Ancak, yüklem sözdizimsel olarak doğru olmalıdır.
Gözlemlemek
. observe-Ayantantik bir kontrol semantiğidir. Genel olarak, üç koşul sözleşmenin ihlaline yol açabilir:
- Yüklemin değerlendirilmesi
falseGeriye doğru. - Yüklemin değerlendirilmesi bir istisnaya neden olur.
- Yükleme, derleme sırasında değerlendirilir, ancak yüklem sabit bir ifade değildir.
Derleme döneminde sözleşmenin ihlali meydana gelirse, bir teşhis ve sürekli derleme yapılır.
Sonunda sözleşmenin ihlali meydana gelirse, sözleşme ihlalinin yöneticisi bir nesne tarafından veri türüne göre geri çağrılır const std::contracts::contract_violation Sözleşmenin ihlali hakkında bilgi içerdiğini ifade eder. Sözleşme ihlali normal olarak geri dönerse, programın yürütülmesi devam eder.
uygula
. enforce-Mantic, sonunda sözleşme ihlali yöneticisini çağırıyor. Program, sözleşme yöneticisi normal geri döndüğünde sona erer. . enforce-Ayantic, sözde terminal semantiğidir. Bu, sözleşmenin ihlali durumunda programın yürütülmesinin sona erdiği anlamına gelir. Dolayısıyla aşağıdaki eylemlerden biri gerçekleştirilebilir:
- Araştırmak
std::terminate,, - Araştırmak
std::abortVEYA - İnfazın hemen sona ermesi.
Derleme derleme döneminde iptal edilir.
Aperce Quast
. quick-enforce-Ayantic, sonunda sözleşme ihlali yöneticisini çağırmaz. Program bir terminal semantiği olarak sona erer. Bu durumda, örneğin __builtin_trap() kullanılmış.
Derleme derleme döneminde iptal edilir.
Sözleşmeye dayalı ihlal
Sözleşme İhlal Yöneticisi aşağıdaki imzaya sahiptir:
void handle_contract_violation( std::contracts::contract_violation );
Uygulama, sözleşmenin standart ihlalini sağlar. Bununla birlikte, standart sözleşmenin bu ihlalinin bir gelenekten değiştirilmesine de izin verebilir.
Mükemmel sunumunda, VIG 2025 Timur Dougler üzerindeki C ++ sözleşmeleri, sözleşmeli ihlal operatörlerinin kişiselleştirilmiş gerçekleri bazı heyecan verici örneklerini tanıttı:
// Protokollierung
void handle_contract_violation( std::contracts::contract_violation violation ) {
LOG(std::format("Contract violated at: {}n", violation.location()));
}
// Setze einen Haltepunkt
void handle_contract_violation( std::contracts::contract_violation violation ) {
std::breakpoint();
}
// Warte, bis ein Debugger angeschlossen ist
void handle_contract_violation( std::contracts::contract_violation violation ) {
while (!std::is_debugger_present())
/* spin */
std::breakpoint();
}
// Stacktrace ausgeben
void handle_contract_violation( std::contracts::contract_violation violation ) {
std::cout << std::stacktrace::current(1);
}
// An den Standard-Handler für Vertragsverletzungen übergeben
void handle_contract_violation( std::contracts::contract_violation violation ) {
std::cout << std::stacktrace::current(1);
std::contracts::invoke_default_contract_violation_handler(violation);
}
Son olarak, nesnenin arayüzünü istiyorum std::contracts::contract_violation Sözleşme suçlusunun aldığını belirtin:
kindSözleşmenin ihlali türünü iade eder.semanticSözleşmenin ihlali meydana geldiğinde bir değerlendirme anlambilimini döndürür.is_terminatingDeğerlendirme anlambilim sona ererse geri döner.detection_modeSözleşmenin ihlal edilmesinin nedenini verir.evaluation_exceptionBir tane verir Std :: istisna_ptrzur İLE Yüklem değerlendirmesi sırasında tetiklenen istisna.commentSözleşmenin ihlali için açıklayıcı bir dize döndürür.locationBir tane verirstd::source_locationSözleşmenin ihlali yerini gösteren geri.
Hakkında daha fazla bilgi std::contracts::contract_violation-Perferans sayfayı bulabilirsiniz.
Sırada ne var?
Bir sonraki makalemde, C ++ 26'nın en küçük özelliklerine odaklanacağım. Ana dildeki küçük güvenlik özellikleriyle başlıyorum.
(RME)

Bir yanıt yazın