我在 B. Stroustrup 的关于 C++17 的思考中阅读了有关合同的内容,并协助了一个小型演示文稿谈论它们,但我不确定我是否真的理解它们。
所以我有一些询问,如果可以用一些例子来说明它们:
合约只是经典的更好的替代品,
assert()
它们应该一起使用吗?对于软件开发人员来说,哪些合同真的很简单?合同会对我们处理异常的方式产生影响吗?如果是,我们应该如何使用例外和合同?
使用合约是否意味着执行时的开销?我们是否可以在发布代码上停用它们?
从提案 N4415:
Vector 类的索引操作符的前置条件契约可以写成:
T& operator[](size_t i) [[expects: i < size()]];
类似地,ArrayView 类的构造函数上的后置条件契约可以表示为:
ArrayView(const vector<T>& v) [[ensures: data() == v.data()]];
感谢@Keith Thompson 评论:
合同没有进入 C++20。一个新的研究组 SG21 已经成立。