【问题标题】:What is (in simple understanding) narrow contract and wide contract in terms of c++ interface(s)?就 c++ 接口而言,什么是(简单理解)窄合同和宽合同?
【发布时间】:2018-12-19 22:04:00
【问题描述】:

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

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

我能看一个区分这两个合约的简单函数示例吗?

【问题讨论】:

  • 你读过this吗?
  • 知道了...感谢您的链接。

标签: c++ c++11 interface


【解决方案1】:

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

“输入”还可能包括全局状态或调用成员函数的对象。明确定义的行为可能意味着抛出异常。

例如,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这样的指针,*操作符有一个狭义的约定,因为你只能在指针指向有效对象时解引用它,但没有通用的方法在取消引用之前验证指针。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多