【问题标题】:What are the differences between Concepts and Contracts?概念和合同有什么区别?
【发布时间】:2020-03-14 13:29:11
【问题描述】:
  • 概念是 C++ 编程语言提供的模板功能的扩展。概念被命名为模板参数上的布尔谓词,在编译时进行评估。一个概念可能与一个模板(类模板、函数模板或类模板的成员函数)相关联,在这种情况下,它充当一个约束:它限制了作为模板参数接受的参数集。
  • 合同允许使用谓词注释函数,表示为 C++ 表达式,引用对函数调用者施加的尽可能多的实际要求,关于传递的参数值和程序的状态;以及承诺的结果细节,包括返回的值和之后程序的状态。

您能否举几个具体的例子来解释这些差异?

【问题讨论】:

  • 概念是一种编译时特性并处理类型。合同类似于例外,其思想是为函数提供前置条件、后置条件和断言。这将在运行时进行检查,并在出现任何问题时调用违规处理程序。然后可以在编译程序时打开或关闭合同。很像NDEBUG 和断言。 Here's a read 给你。

标签: c++ c++20


【解决方案1】:

首先,最明显的是:概念是 C++20 的一部分;合同不是

第二,概念是编译时的要求;合同是运行时要求。

第三,概念主要与类型的行为有关。虽然概念可以用于值,但这些值必须是编译时值,因为概念是编译时构造。合同主要关注价值的行为,因为任何类型的问题在合同变得相关时都已经解决了。

最重要的区别是功能,它们的作用。

一个概念主要是为了让一段代码(通常是一个模板)根据某物(通常是该模板的参数)是否满足一组要求而出现或消失。约束代码的要点是,如果不满足要求,则定义基本上不存在。当一段代码的约束失败时,这并不是先验坏的;可能存在约束较少甚至不受约束的代码版本,它们的执行方式不同。

合同旨在传达对运行时对象值的约束,最常见的情况是函数的参数。违反合同总是一件坏事,程序表现出未定义的行为。

【讨论】:

  • C++20 的合同已获得批准,但随后 WG21 发现它们并没有想象中的那么好。因此,他们没有在 C++20 中加入一些半生不熟的东西,而是做出了艰难的决定,将合同推迟到下一个 C++ 标准 (C++2b)。因为一旦它们在野外,就很难编辑它们。合同是 Herb Sutter 真正期待的功能之一。这个决定不是轻易做出的。
  • @Eljay:“但后来 WG21 发现他们并没有像想象的那样准备好”我不会这么说。更多的是,一群看过原始提案的人看到了进入标准的版本,并意识到在适应过程中发生了一些哲学上的变化,以至于他们最初同意的已经变成了别的东西。他们对此并不满意。
  • Re“通常是一个模板”:只有当它是模板类的成员或朋友时,您才能约束非模板函数。
  • @NicolBolas:我不确定他们的理解哲学(以及彼此对它的理解)的变化。
  • @NicolBolas:失败(启用)assert 不是未定义的行为。我还没有做考古来检查“原始”合同提案,但我会对无法重现(即使有配置)的合同设施感到非常惊讶。事实上,我对那些早期提案的作者的理解是,UB 的可能性并不是他们的主要目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2013-03-18
  • 2014-04-03
  • 2011-03-28
  • 2016-04-24
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多