在c ++接口方面,什么是(简单理解)窄合同和宽合同?

时间:2018-07-11 19:11:36

标签: c++ c++11 interface

在介绍一些c++11概念时,我遇到了narrow contractwide contract这两个术语。

但是我无法找出为这些合同编写的简单函数示例。

我可以看到一个简单的函数示例来区分这两个合约吗?

1 个答案:

答案 0 :(得分:5)

广泛的合同功能对所有可能的输入都有明确的行为,而狭窄的合同意味着只有在满足某些先决条件时才能调用这些功能。

请注意,输入可能包括某些全局状态或为其调用成员函数的对象。还要注意,行为良好的定义可能意味着抛出异常。

例如,std::vector<int>-s .size()成员函数具有广泛的约定,因为可以在向量的任何实例上调用它(如std::vector<int> v; /* anything can happen with v here... */; auto s = v.size();始终有效)。 operator[](size_t index)(与int x = v[10]一样)具有狭窄的约定,因为只能使用小于.size()的参数来调用它,否则它是未定义的。 .at(size_t i)成员函数(如int y = v.at(10))具有广泛的约定,因为它被指定为在索引超出范围时引发异常。

请注意,前提条件并不总是很容易验证:对于诸如int* p之类的指针,*运算符可以理解为具有狭窄的约定,因为您只能在指向一个指针时取消引用它。一个有效的对象,但这很棘手,因为没有简单的方法来检查您是否可以int x = *p

相关问题