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