Если у нас есть:
void foo(int) {}
void foo(const int&) {}
, мы не можем вызвать foo
вот так:
foo(3);
, потому что вызов неоднозначен:
error: call of overloaded 'foo(int)' is ambiguous
40 | foo(3);
| ^
note: candidate: 'void foo(int)'
36 | void foo(int) {}
| ^~~
note: candidate: 'void foo(const int&)'
37 | void foo(const int&) {}
| ^~~
Что мы можем сделать, так это явно указать правильную перегрузку, например, с помощью указателя на функцию:
auto (*ptr)(const int&) -> void = foo;
ptr(3); // calls the "const int&" overload, obviously
Однако такой вид побеждает цель удобных перегрузок. Вопрос в том, можно ли как-нибудь устранить неоднозначность вызова более ... элегантным? способом? Существуют ли когда-либо случаи, когда было бы желательно предоставить обе перегрузки для T
и const T&
?