【发布时间】:2018-12-19 22:04:00
【问题描述】:
在浏览一些c++11 概念时,我遇到了narrow contract 和wide contract 这两个术语。
但我没能找到为这些合同编写的简单函数示例。
我能看一个区分这两个合约的简单函数示例吗?
【问题讨论】:
-
你读过this吗?
-
知道了...感谢您的链接。
在浏览一些c++11 概念时,我遇到了narrow contract 和wide contract 这两个术语。
但我没能找到为这些合同编写的简单函数示例。
我能看一个区分这两个合约的简单函数示例吗?
【问题讨论】:
宽合约函数对所有可能的输入都有明确定义的行为,而窄合约意味着只有在满足某些先决条件时才能调用函数。
“输入”还可能包括全局状态或调用成员函数的对象。明确定义的行为可能意味着抛出异常。
例如,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这样的指针,*操作符有一个狭义的约定,因为你只能在指针指向有效对象时解引用它,但没有通用的方法在取消引用之前验证指针。
【讨论】: