Код: Выделить всё
#include
void foo(int num) {}
void foo(int&& num) {}
int main() {
foo(5);
// error: call of overloaded 'foo(int)' is ambiguous
// note: candidate: 'void foo(int)'
// note: candidate: 'void foo(int&&)'
// same with a move:
int x = 5;
foo(std::move(x));
// error: call of overloaded 'foo(std::remove_reference::type)' is ambiguous
// ...
}
Какова семантическая причина, по которой foo(int&&) не должен иметь более высокий приоритет при разрешении перегрузки? Может просто вообще нет смысла заморачиваться с такой перегрузкой?
Насколько я понимаю, оба случая int и int&& семантически одинаковы внутри тела функции foo(...). Т.е. в обоих случаях параметр num является временным (в стеке) lvalue в теле функции, а не ссылкой на что-то, что волнует пользователя foo. Таким образом, нет смысла иметь разные тела функций. Разница заключается в интерфейсе для пользователя: интересует ли пользователя объект и хочет ли он передать его копию, или нет. Но если вы хотите охватить оба случая аргументов int и int&&, вы можете просто использовать foo(int). Нет необходимости в перегрузке. А если вы хотите сузить круг, у вас есть foo(int&&). (Идея параметра «только копирование», который не может связывать значения r, не имеет особого смысла.)
Подробнее здесь: https://stackoverflow.com/questions/793 ... o-match-an