概念和合同之间有什么区别?
What are the differences between Concepts and Contracts?
- 概念是 C++ 编程语言提供的模板功能的扩展。概念在模板参数上命名为布尔谓词,在编译时评估。一个概念可能与一个模板(class 模板、函数模板或 class 模板的成员函数)相关联,在这种情况下,它充当约束:它限制了接受的参数集作为模板参数。
- 合同允许使用谓词注释函数,表示为 C++ 表达式,引用尽可能多的对函数调用者施加的要求,关于传递的参数值和程序的状态;以及承诺的结果的详细信息,包括返回的值和之后的程序状态。
能否请您举几个具体的例子来说明区别?
首先,最明显的是:概念是 C++20 的一部分;合同是不是。
其次,概念是编译时要求;合同是运行时要求。
第三,概念主要与类型的行为有关。虽然概念可以用于值,但这些值必须是编译时值,因为概念是编译时构造。契约主要关注值的行为,因为在契约变得相关时任何类型的问题都已经解决了。
最重要的区别在于功能,即它们的作用。
一个概念的主要目的是根据某些东西(通常是该模板的参数)是否满足一组要求来使一段代码(通常是模板)出现或消失。约束代码的要点是,如果不满足要求,则定义基本上不存在。当一段代码的约束失败时,这并不是 a priori 坏的;可能会有执行不同的代码的约束较少甚至不受约束的版本。
合同旨在传达对运行时对象值的约束,最常见的情况是函数的参数。违反契约总是一件坏事,程序表现出未定义的行为。
- 概念是 C++ 编程语言提供的模板功能的扩展。概念在模板参数上命名为布尔谓词,在编译时评估。一个概念可能与一个模板(class 模板、函数模板或 class 模板的成员函数)相关联,在这种情况下,它充当约束:它限制了接受的参数集作为模板参数。
- 合同允许使用谓词注释函数,表示为 C++ 表达式,引用尽可能多的对函数调用者施加的要求,关于传递的参数值和程序的状态;以及承诺的结果的详细信息,包括返回的值和之后的程序状态。
能否请您举几个具体的例子来说明区别?
首先,最明显的是:概念是 C++20 的一部分;合同是不是。
其次,概念是编译时要求;合同是运行时要求。
第三,概念主要与类型的行为有关。虽然概念可以用于值,但这些值必须是编译时值,因为概念是编译时构造。契约主要关注值的行为,因为在契约变得相关时任何类型的问题都已经解决了。
最重要的区别在于功能,即它们的作用。
一个概念的主要目的是根据某些东西(通常是该模板的参数)是否满足一组要求来使一段代码(通常是模板)出现或消失。约束代码的要点是,如果不满足要求,则定义基本上不存在。当一段代码的约束失败时,这并不是 a priori 坏的;可能会有执行不同的代码的约束较少甚至不受约束的版本。
合同旨在传达对运行时对象值的约束,最常见的情况是函数的参数。违反契约总是一件坏事,程序表现出未定义的行为。