5

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

Herb Sutter 的旅行报告指出:

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

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

程序的违规处理程序是“<code>noexcept opt function of (lvalue reference to const std​::​contract_­violation) 返回void”类型的函数,并以实现定义的方式指定。[...]不应该有设置或修改违规处理程序的编程方式。它是由实现定义的,如何为程序建立违规处理程序以及如何设置std​::​contract_­violation([support.contract.cviol]) 参数值,除非下面指定。

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

4

1 回答 1

2

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

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

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

于 2018-07-03T04:06:17.860 回答