为合约指定冲突处理程序

Specifying a violation handler for contracts

本文关键字:冲突 处理 程序      更新时间:2023-10-16

支持C++中基于契约的编程 在拉珀斯维尔通过了 C++20 工作草案。此语言功能的一部分是违规处理程序的概念,当违反合同时将调用该处理程序

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

您可以安装自己的违规处理程序并发布发布版本,并可以选择在运行时启用强制实施。

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

程序的违规处理程序是类型为"noexceptopt函数(左值引用const std​::​contract_­violation(返回void",并以实现定义的方式指定。[...]不应有设置或修改冲突处理程序的编程方法。它是实现定义的,如何为程序建立违规处理程序以及如何设置std​::​contract_­violation([support.contract.cviol]( 参数值,除非下面指定。

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

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

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

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