Ранжирование последовательностей неявного преобразования [f (int) и f (const int &)] - PullRequest
0 голосов
/ 12 марта 2020

Рассмотрим следующие функции:

void f(int) {...}
void f(const int&) {...}

Они разные и их определения успешно компилируются. Но есть ли способ вызвать любого из них, когда они оба участвуют в разрешении перегрузки? И если нет способа, почему они не считаются одной и той же функцией, как эти две:

void g(int) {...}
void g(const int) {...} // error: redefinition of 'void g(int)'

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Если вы хотите явно вызвать определенную функцию из набора перегрузок, вы можете привести функцию к указателю на функцию с подписью, которую вы хотите. Это выглядело бы как

void f(int) { std::cout << "void f(int) \n"; }
void f(const int&) { std::cout << "void f(const int&)\n"; }

int main () 
{
    auto fi = static_cast<void(*)(int)>(f);
    auto fciref = static_cast<void(*)(const int&)>(f);
    fi(2);
    fciref(2);
}

, который выдает

void f(int) 
void f(const int&)

В противном случае вы не можете вызвать свою функцию, так как ни одна из них не лучше, чем другая в соответствии с правилами t ie.

2 голосов
/ 12 марта 2020

Компилятор автоматически удаляет верхний уровень const, поэтому он может сказать, что последние два являются переопределением. Он не может сказать в первом примере, и компилятор не собирается выяснять, приведет ли вызов функции с набором аргументов к неоднозначности, пока вы не вызовете ее.

...