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

Pav*_*aka 8 c++ interface c++11

在浏览一些c++11概念时,我遇到了术语narrow contractwide contract

但是我没有找到为这些合同编写的简单函数示例。

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

pal*_*asb 9

宽合同功能对所有可能的输入都有明确定义的行为,而窄合同意味着仅在满足某些先决条件时才能调用该功能。

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

例如,std::vector<int>-s .size()成员函数具有广泛的约定,因为可以在向量的任何实例上调用它(因为in 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