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