Информация об изменениях

Сообщение Re[2]: Concept equality preservation от 26.02.2024 21:38

Изменено 26.02.2024 21:52 rg45

Re[2]: Concept equality preservation
Здравствуйте, Кодт, Вы писали:

К>Поэтому во время компиляции нам наплевать, изменяются ли значения. Компилятор вообще не оперирует значениями.

К>(Хотя! Если мы туда присобачим какие-нибудь constexpr функции... Надо проверить!)

Ну а почему нет?

http://coliru.stacked-crooked.com/a/fe4bcdabba3eb849

template <int f(), int value>
concept ReturnsValue = (f() == value);

constexpr int foo() { return 42; }

static_assert(ReturnsValue<foo, 42>);
static_assert(!ReturnsValue<foo, 43>);
Re[2]: Concept equality preservation
Здравствуйте, Кодт, Вы писали:

К>Поэтому во время компиляции нам наплевать, изменяются ли значения. Компилятор вообще не оперирует значениями.

К>(Хотя! Если мы туда присобачим какие-нибудь constexpr функции... Надо проверить!)

Ну а почему нет?

http://coliru.stacked-crooked.com/a/b9391979d785339e

template <auto expected, auto f, auto...args>
concept ExpectEqual = (expected == f(args...));

constexpr size_t factorial(size_t x) { return x > 0 ? x * factorial(x - 1) : 1; }

static_assert(ExpectEqual<1, factorial, 0>);
static_assert(ExpectEqual<1, factorial, 1>);
static_assert(ExpectEqual<2, factorial, 2>);
static_assert(ExpectEqual<6, factorial, 3>);
static_assert(ExpectEqual<24, factorial, 4>);
static_assert(ExpectEqual<120, factorial, 5>);

static_assert(!ExpectEqual<2, factorial, 42>);