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