【问题标题】:Specifying a violation handler for contracts为合同指定违规处理程序
【发布时间】:2018-07-03 01:55:12
【问题描述】:

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

Herb Sutter's trip report 声明:

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

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

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

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

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

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

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

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

    【讨论】:

    • 这对我来说似乎很奇怪......我想我们只能等着看它何时实施?
    • @Barry:没那么奇怪。关键是函数调用是静态的,不像对terminate 处理程序的调用是动态的。这样,编译器可以更有效地对其进行优化。
    • 我认为优化 violation handler 调用并不重要。就像-这甚至不应该在正确的程序中发生,对吗?使跨多个编译器的指定变得容易似乎更重要。
    • @Barry:我认为这不是调用本身的性能优化问题。这更多的是用于测试违反合同的代码生成问题。这样一来,一切都是静态的。也可能涉及 DLL/SO 问题。
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多