вызов перегружен неоднозначен из-за ссылок - PullRequest
0 голосов
/ 27 января 2019

У меня есть этот код, который прекрасно компилируется:

void foo(int x){std::cout << "value copy" << std::endl;} // foo(5) or foo(n)
void foo(int &x){std::cout << "lvalue ref" << std::endl;} // foo(n) only
void foo(int &&x){std::cout << "rvalue ref" << std::endl;} // foo(5) only

, но поскольку у меня есть ссылки на версии, это неоднозначно.
как вы собираетесь использовать эту функциональность?я думал, что компилятор выдаст мне ошибку.

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

1 Ответ

0 голосов
/ 27 января 2019

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

В случае, когда параметры двух сравниваемых перегрузок являются эталонными привязками, стандарт определяетчто является лучшим связыванием согласно [over.ics.rank] /3.2.3 до [over.ics.rank] /3.2.6.Эти правила позволяют компилятору выбирать, является ли foo(int&) или foo(int&&) лучшим соответствием для данного типа аргумента.

Но нет правила, которое указывает, является ли аргумент, переданный по значению, лучше, чем связанный аргументс опорным параметром.Так что для этого простого случая, когда все перегрузки принимают int либо по ссылке, либо по значению, вызов foo всегда будет неоднозначным, если аргумент не является константным.(Если тип аргумента является константным, foo(int&) и foo(int&&) не являются допустимыми перегрузками).

...