As T.C. указывал в комментариях, поэтому для этого НЕ «принимать только lvalues». const
ссылки привязываются к rvalues просто отлично.
Причина в том, что функции могут быть перегружены в категорию значений неявного параметра объекта, только если ALL overloads задает категорию значений. То есть, когда вы добавляете перегрузку с &&
, которая соответствует только rvalues, она не будет компилироваться, если вы не добавите &
к существующей перегрузке.
В 13.1, здесь формулировка правила:
функция член декларации с тем же именем и тем же параметр типа-списка, а также деклараций шаблонных функций-членов с тем же именем, тот же список параметров-типа и те же самые параметры шаблонов параметров не могут быть перегружены, если какой-либо из них, но не у всех, имеет ref-qualifier.
и дает пример
class Y
{
void h() &;
void h() const &; // OK
void h() &&; // OK, all declarations have a ref-qualifier
void i() &;
void i() const; // ill-formed, prior declaration of i
// has a ref-qualifier
};
Это на самом деле компилирует! Mind blown>.
@NeilKirk Почему бы и нет? –
@ T.C. Я никогда не видел этот синтаксис раньше. –