utx::bare_t is a type-trait used to extract the basic type from a complicated type,
utx::ix32 from const utx::ix32 &
utx::fx64 from const utx::fx64 * &
utx::ix32 from const utx::ix32(*)[3][4][5][6]
utx::ix32(utx::fx64 &, const utx::ix32) from utx::ix32(&)(utx::fx64 &, const utx::ix32)
It uses utx::decay_t at first, but then utx::decay_t is found not the same as std::decay_t, and it has different goals compared with std::decay_t, so utx::decay_t is removed, and then utx::bare_t is added .
Applying utx::bare_t to an array type, it will extract a basic data type; but applying utx::bare_t to a function type, it will extract a funtion prototype, not a basic data type. That's because utx::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, utx::bare_t can not get exactly one basic data type of a function type.
#include <utxcpp/core.hpp> int main() { using t1 = const utx::ix32; using t2 = t1 ************; using t3 = const t2 &; static_assert(utx::same_as<utx::bare_t<t3>, utx::ix32>); }