Сравнение типов

В Ü существует оператор same_type, который сравнивает переданные типы на равенство. Этот оператор принимает два аргумента-типа и возвращает constexpr значение типа bool. Значение равно true, если типы равны или false, если они различны.

Пример использования:

static_assert( same_type</ u32, size_type /> || same_type</ u64, size_type /> );

Данный оператор предназначен прежде всего для использования в шаблонном коде для случаев, когда надо проверить равенство типов. Например, таким образом:

template</ type T /> fn Process( T& arg )
{
    if( same_type</ T, ust::string8 /> )
    {
        ProcessString(arg);
    }
    else
    {
        ProcessGeneric(arg);
    }
}

Результат сравнения аналогичен сравнению, которое происходит внутри компилятора. Сравнение считает различными типы различных видов. Например, одинаковые по составу массивы/кортежи/структуры считаются различными. Различными являются все структуры/классы, т. к. их идентичность определяется их именем (включая путь от корневого пространства имён). Это включает в себя также наследование - предок и потомок различны. Аналогично различны все перечисления.

Фундаментальные типы тоже все между собою различны. Исключение - size_type, который пока что является псевдонимом к одному из целочисленных беззнаковых типов.

Указатели на функцию различны, если различны типы функций. При этом есть ряд нюансов. Неявный возвращаемый void тип аналогичен явно-указанному. imut/mut модификаторы для параметров-значений не влияют на тип функции. Также существуют имена соглашений о вызовах, которые различаются, но представляют внутри одно и то же соглашение о вызовах, например «Ü» и «C». Аргумент this аналогичен не-this ссылочному аргументу типа класса.

Важно отметить также, что псевдонимы не создают различных типов. Например:

type Int= i32;
static_assert( same_type</ Int, i32 /> ); // сравнение вернёт true