Учитывая все три функции, этот вызов неоднозначен.
int f( int );
int f( int && );
int f( int const & );
int q = f( 3 );
Удаление f( int )
приводит к тому, что Clang и GCC предпочитают ссылку rvalue по ссылке lvalue. Но вместо этого удаление двух опорных значений перегрузки в двусмысленности с помощью f( int )
.
Разрешение перегрузки обычно выполняется с точки зрения строгого частичного упорядочения, но int
представляется эквивалентным двум вещам, которые не эквивалентны друг другу. Какие здесь правила? Кажется, я вспоминаю отчет об ошибках.
Есть ли вероятность, что int &&
может быть предпочтительнее int
в будущем стандарте? Ссылка должна привязываться к инициализатору, тогда как тип объекта не так ограничен. Поэтому перегрузка между T
и T &&
может фактически означать "использовать существующий объект, если мне дали право собственности, иначе сделайте копию". (Это похоже на чистый проход по значению, но экономит накладные расходы на перемещение.) Поскольку эти компиляторы в настоящее время работают, это необходимо сделать, перегружая T const &
и T &&
и явно копируя. Но я даже не уверен, что это стандартно.