В этом вопросе происходит перегрузка оператора, но количество аргументов и тип одинаковы - PullRequest
0 голосов
/ 18 апреля 2019

Следующий код должен генерировать ошибку компиляции по мне. Потому что я думаю, что компилятор может быть смущен, узнав, какую функцию foo () вызывать.

#include <iostream> 

typedef long long ll;

void foo(unsigned ll) {
    std::cout << "1";
}

void foo(unsigned long long) {
    std::cout << "2";
}

int main() {
    foo(2ull);
}

Я ожидал, что компилятор обработает foo(unsigned ll) как foo(unsigned long long).

Ответы [ 2 ]

8 голосов
/ 18 апреля 2019

В этом коде не происходит перегрузок операторов.И этот код должен хорошо компилироваться.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)

3 голосов
/ 18 апреля 2019

В этом коде нет ничего плохого. Typedef используется для создания псевдонимов для существующих типов. Он не заменяет ll на long long в foo (unsigned ll). В основном, он обрабатывает ll как параметр, а тип - это unsigned int. Но во втором типе параметра foo () unsigned long long.

Ваш код будет отображать ошибку компиляции, если вы используете #define ll long long вместо typedef long long ll;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...