Concept equality preservation
От: rg45 СССР  
Дата: 26.02.24 11:40
Оценка:
Привет всем!

Может мне кто-нибудь объяснить по-простому, что за зверь — equality preservation и какую роль он играет при определении концептов, желательно с примерами?

Например, есть концепт regular_invocable, который определен следующим образом:

template< class F, class... Args >
concept regular_invocable = std::invocable<F, Args...>;


Говорится, что reqular_invocable отличается от просто invocable как раз вот тем самым свойством equality preservation. Хотелось бы понимать, почему это важно и как это свойство проявляется при практическом использовании.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.02.2024 13:45 rg45 . Предыдущая версия . Еще …
Отредактировано 26.02.2024 12:16 rg45 . Предыдущая версия .
Отредактировано 26.02.2024 12:15 rg45 . Предыдущая версия .
Re: Concept equality preservation
От: Кодт Россия  
Дата: 26.02.24 12:25
Оценка: 12 (2) +1
Здравствуйте, rg45, Вы писали:

R>Может мне кто-нибудь объяснить по-простому что за зверь — equality preservation и какую роль он играет при определении концептов, желательно с примерами?


Для меня это новинка, но из сумбурного описания и примеров на cppreference я могу сделать следующий вывод.
В requires statement пишется ряд выражений.
Эти выражения либо изменяют, либо не изменяют аргументы
requires(Foo f, Bar b)
{
  foo(f);
  bar(b);
  buz(f, b);
}


Смысл вот какой. requires сейчас может проверять только синтаксис и семантику на уровне "нашли ли подходящую функцию" и "тот ли тип мы вернули".
Поэтому во время компиляции нам наплевать, изменяются ли значения. Компилятор вообще не оперирует значениями.

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

Но возможно, что в будущем компилятор сможет копать глубже, и делать какие-то рантаймовые проверки, вида "а вот если мы сконструировали объект, то будет ли функция над ним возвращать то или иное..."

Поэтому с самого начала оговаривается, что — в пользовательских концептах любую дичь творите, а в стандартной библиотеке неконстантные действия только в известном и узко ограниченном наборе концептов.
Перекуём баги на фичи!
Re[2]: Concept equality preservation
От: rg45 СССР  
Дата: 26.02.24 21:38
Оценка: +1
Здравствуйте, Кодт, Вы писали:

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

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

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

http://coliru.stacked-crooked.com/a/80f1f5a269b4f138

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

template <auto expected, auto f, auto...args>
concept ExpectNotEqual = !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<720, factorial, factorial(3)>);

static_assert(ExpectNotEqual<0, factorial, 0>);
static_assert(ExpectNotEqual<7, factorial, 3>);
static_assert(ExpectNotEqual<1, factorial, 1, 2, 3, 4, 5>);


Компайл-тайм юнит-тесты
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.02.2024 22:11 rg45 . Предыдущая версия . Еще …
Отредактировано 26.02.2024 22:07 rg45 . Предыдущая версия .
Отредактировано 26.02.2024 21:54 rg45 . Предыдущая версия .
Отредактировано 26.02.2024 21:52 rg45 . Предыдущая версия .
Re[3]: Concept equality preservation
От: Кодт Россия  
Дата: 28.02.24 13:28
Оценка:
Здравствуйте, rg45, Вы писали:

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


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


Ещё нет, потому что мы не втащили сюда неконстантность.
Перекуём баги на фичи!
Re: Concept equality preservation
От: reversecode google
Дата: 28.02.24 14:11
Оценка:
https://stackoverflow.com/a/64739403
Re: Concept equality preservation
От: reversecode google
Дата: 28.02.24 14:21
Оценка: 24 (2)
лень логиниться что бы дополнить свое
так что вот еще

https://www.cppstories.com/2021/concepts-callables/#whats-all-about-this-regularity
Re[4]: Concept equality preservation
От: _NN_ www.nemerleweb.com
Дата: 29.02.24 07:21
Оценка: 7 (1)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, rg45, Вы писали:


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


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


К>Ещё нет, потому что мы не втащили сюда неконстантность.


А как же NON-CONSTANT CONSTANT-EXPRESSIONS IN C++ ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.