Rapperswil的C ++ 20工作草案采用了对C ++中基于合同的编程的支持 。这种语言功能的一部分是违反处理程序的概念,当违反合同时将调用该处理程序。
您需要安装自己的违规处理程序并发布发布版本,并可以选择在运行时打开强制执行。
但是,本文在[dcl.attr.contract]中添加的措辞说:
程序的违规处理程序是类型为“ (返回的左值引用)的
noexceptopt函数”类型的函数,并以实现定义的方式指定。[...]应该没有编程的方式来设置或修改违规处理程序。除非以下指定,否则它是由实现定义的,如何为程序建立违规处理程序以及如何设置[[support.contract.cviol])参数值。const std?::?contract_violationvoidstd?::?contract_violation
这对我来说还不清楚。实现如何允许我以非编程方式设置自己的违规处理程序?我必须在gcc,clang和msvc上做什么?
实现如何允许我以非编程方式设置自己的违规处理程序?
这是由实现来确定的,但我更怀疑它是某种命令行参数。您可以命名一个函数,编译器/链接器会将其设为违规处理程序。如果不是这样,那么他们可能会选择您实现的一些特定函数名称。
这里的要点是,从 C++ 抽象模型的角度来看,所使用的函数是static 的。当编译器启动时,它确切地知道将调用哪个函数,就像系统对 的调用一样,也知道程序中处理返回值main的部分。main