Я читал о контрактах в Мысли о C++ 17 Б. Страуструпа и помог провести небольшую презентацию, рассказав о них, но я не уверен, что действительно их понял.
Итак, у меня есть несколько вопросов, и если можно проиллюстрировать их некоторыми примерами:
Являются ли контракты просто лучшей заменой классического
assert(), и следует ли их использовать вместе? Какие контракты действительно сформулированы простым языком для разработчика программного обеспечения?Повлияют ли контракты на то, как мы обрабатываем исключения? Если да, то как нам использовать исключения и контракты?
Будет ли использование контрактов означать накладные расходы во время выполнения? Будет ли нам разрешено деактивировать их в коде выпуска?
Контракт предварительного условия оператора индексации класса Vector можно записать так:
T& operator[](size_t i) [[expects: i < size()]];Точно так же контракт пост-условия для конструктора класса ArrayView может быть выражен как:
ArrayView(const vector<T>& v) [[ensures: data() == v.data()]];
Благодаря комментарию @Keith Thompson:
Контракты не вошли в C++20. Новая исследовательская группа, SG21, был создан.