Animals are good friends of human beings.
esv::bare_t is a type-trait used to extract the basic type from a complicated type,
esv::ix32 from const esv::ix32 &
esv::fx64 from const esv::fx64 * &
esv::ix32 from const esv::ix32(*)[3][4][5][6]
esv::ix32(esv::fx64 &, const esv::ix32) from esv::ix32(&)(esv::fx64 &, const esv::ix32)
It uses esv::decay_t at first, but then esv::decay_t is found not the same as std::decay_t, and it has different goals compared with std::decay_t, so esv::decay_t is removed, and then esv::bare_t is added .
Applying esv::bare_t to an array type, it will extract a basic data type; but applying esv::bare_t to a function type, it will extract a funtion prototype, not a basic data type. That's because esv::bare_t tries to extract a bared type as more as it can. A function type has zero or more input parameter types and has a return type, but an array only has one basic data type, esv::bare_t can not get exactly one basic data type of a function type.
#include <esvcpp/core.hpp> int main() { using t1 = const esv::ix32; using t2 = t1 ************; using t3 = const t2 &; static_assert(esv::same_as<esv::bare_t<t3>, esv::ix32>); }