指定合同违规处理程序

Bar*_*rry 5 c++ c++20

Rapperswil的C ++ 20工作草案采用了对C ++中基于合同的编程的支持 。这种语言功能的一部分是违反处理程序的概念,当违反合同时将调用该处理程序

赫伯·萨特(Herb Sutter)的旅行报告指出:

您需要安装自己的违规处理程序并发布发布版本,并可以选择在运行时打开强制执行。

但是,本文在[dcl.attr.contract]中添加的措辞说:

程序的违规处理程序是类型为“ (返回的左值引用)的noexceptopt函数”类型的函数,并以实现定义的方式指定。[...]应该没有编程的方式来设置或修改违规处理程序。除非以下指定,否则它是由实现定义的,如何为程序建立违规处理程序以及如何设置[[support.contract.cviol])参数值。const std?::?contract_­violationvoidstd?::?contract_­violation

这对我来说还不清楚。实现如何允许我以非编程方式设置自己的违规处理程序?我必须在gcc,clang和msvc上做什么?

Nic*_*las 2

实现如何允许我以非编程方式设置自己的违规处理程序?

这是由实现来确定的,但我更怀疑它是某种命令行参数。您可以命名一个函数,编译器/链接器会将其设为违规处理程序。如果不是这样,那么他们可能会选择您实现的一些特定函数名称。

这里的要点是,从 C++ 抽象模型的角度来看,所使用的函数是static 的。当编译器启动时,它确切地知道将调用哪个函数,就像系统对 的调用一样,也知道程序中处理返回值main的部分。main