在介绍一些c++11
概念时,我遇到了narrow contract
和wide contract
这两个术语。
但是我无法找出为这些合同编写的简单函数示例。
我可以看到一个简单的函数示例来区分这两个合约吗?
答案 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
。