Здравствуйте, vdimas, Вы писали:
V>А есть внятное объяснение, почему это работает? ))
При каждом обращении на значение fable делается заново переисчисление Entropy (в связи с механизмом его поставки через дефолтное значение), а там кложура, которая каждый раз новая/уникальная. Таким образом каждый раз получаем новую инстанцию с новой Entropy, ну и как побочный эффект, перевычисляется наша полезная нагрузка. Кстати, такое не обязательно делать на констрейнтах, можно и на SFINAE
| например |
| #include <type_traits>
template <class T, auto e, class=void>
struct Fable : std::false_type {};
template <class T, auto e>
struct Fable<T, e, std::void_t<decltype(f(T{}))>> : std::true_type {};
template <class T, auto e = []{}>
constexpr bool fable = Fable<T, e>::value;
struct C{};
static_assert(!fable<C>);
void f(C);
static_assert(fable<C>);
|
| |