В этом коде не происходит перегрузок операторов.И этот код должен хорошо компилироваться.typedef
s не являются макросами.Они не просто выполняют текстовую замену токенов.typedef
вводит альтернативное имя для типа, которое может использоваться везде, где может использоваться имя типа.Это:
void foo(unsigned ll)
- это функция с именем foo, которая принимает один аргумент типа unsigned int
и возвращает void
.Имя первого параметра - ll
.Поскольку unsigned
уже является спецификатором типа (это сокращение для unsigned int
), идентификатор ll
, следующий за unsigned
в объявлении параметра, обрабатывается как имя объявляемой сущности.Это означает, что в приведенном выше коде есть две перегрузки для foo
, первая из которых foo(unsigned int)
, а вторая foo(unsigned long long)
.При вызове
foo(2ull);
разрешение перегрузки выберет foo(unsigned long long)
, поскольку тип аргумента 2ull
равен unsigned long long
, что является точным соответствием для foo(unsigned long long)
…