Каковы различия между Концепциями и Контрактами? - PullRequest
0 голосов
/ 14 марта 2020
  • Концепции являются расширением функции шаблонов, предоставляемой языком программирования C ++. Концепции называются логическими предикатами параметров шаблона, которые оцениваются во время компиляции. Концепция может быть связана с шаблоном (шаблоном класса, шаблоном функции или функцией-членом шаблона класса), и в этом случае она служит ограничением: она ограничивает набор аргументов, которые принимаются в качестве параметров шаблона.
  • Контракты позволили аннотировать функции с предикатами, выраженными в виде выражений C ++, ссылаясь на столько практических требований, которые предъявляются к вызывающим функциям, относительно передаваемых значений аргументов и состояния программы; и детали обещанных результатов, как возвращаемое значение, так и состояние программы после.

Не могли бы вы привести несколько конкретных примеров, чтобы объяснить различия?

1 Ответ

3 голосов
/ 14 марта 2020

Во-первых, самое очевидное: понятия являются частью C ++ 20; контракты не .

Во-вторых, концепции требования времени компиляции ; контракты - это требования времени выполнения.

В-третьих, концепции в основном касаются поведения типов. Хотя понятия могут использоваться для значений, эти значения должны быть значениями времени компиляции, поскольку понятия являются конструкциями времени компиляции. Контракты в первую очередь касаются поведения ценностей, так как любые проблемы с типами были решены к тому времени, когда контракт стал актуальным.

Самое важное различие заключается в том, что они делают.

Концепция в первую очередь предназначена для того, чтобы часть кода (обычно шаблон) появлялась или исчезала в зависимости от того, удовлетворяет ли что-то (обычно параметры этого шаблона) ряду требований. Смысл ограничения кода заключается в том, что определение по существу не существует, если требования не выполняются. Когда ограничение для части кода терпит неудачу, это не априори плохо; может существовать менее ограниченная или даже неограниченная версия кода, которая выполняется по-разному.

Контракты предназначены для передачи ограничений на значения объектов времени выполнения, при этом параметры функции являются наиболее распространенным случаем. Нарушение контракта всегда плохо, и программа демонстрирует неопределенное поведение.

...