为合同指定违规处理程序

时间:2018-07-03 01:55:13

标签: c++ c++20

Support for contract based programming in C++ 在Rapperswil的C ++ 20工作草案中被采用。此语言功能的一部分是违反处理程序的概念,当违反合同时将调用该概念。

Herb Sutter's trip report指出:

  

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

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

  

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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