Почему при перегрузке foo(int&&) не имеет приоритета над foo(int) для соответствия значению r?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему при перегрузке foo(int&&) не имеет приоритета над foo(int) для соответствия значению r?

Сообщение Anonymous »

Следующие перегрузки неоднозначны (в C++23 GCC 14.2):

Код: Выделить всё

#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&&) будет иметь приоритет над foo(int), когда функция вызывается со значением rvalue. Например, если вы посмотрите на противоположную ситуацию: нет перегрузок, объявлен только foo(int&&), и вы вызываете его по lvalue foo(x). Он не скомпилируется, поскольку ссылка rvalue int&& не может связать lvalue int. Поскольку foo(int&&) является более узким случаем, чем foo(int), то foo(int&&) следует отдавать предпочтение в ситуации перегрузки для случая rvalue.
Какова семантическая причина, по которой foo(int&&) не должен иметь более высокий приоритет при разрешении перегрузки? Может просто вообще нет смысла заморачиваться с такой перегрузкой?
Насколько я понимаю, оба случая int и int&& семантически одинаковы внутри тела функции foo(...). Т.е. в обоих случаях параметр num является временным (в стеке) lvalue в теле функции, а не ссылкой на что-то, что волнует пользователя foo. Таким образом, нет смысла иметь разные тела функций. Разница заключается в интерфейсе для пользователя: интересует ли пользователя объект и хочет ли он передать его копию, или нет. Но если вы хотите охватить оба случая аргументов int и int&&, вы можете просто использовать foo(int). Нет необходимости в перегрузке. А если вы хотите сузить круг, у вас есть foo(int&&). (Идея параметра «только копирование», который не может связывать значения r, не имеет особого смысла.)

Подробнее здесь: https://stackoverflow.com/questions/793 ... o-match-an
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»