Есть ли разница между функциями-членами с l-значением ref и неквалифицированными функциями-членами? Если так, то, что это?
То есть, это два способа объявления func()
разные?
class Foo
{
void func();
void func() &;
};
Я не имею в виду «достаточно ли они различны для разрешения перегрузки», потому что, очевидно, вышеприведенный класс не компилируется, когда обе версии func()
присутствуют. Я имею в виду, как и почему компилятор ведет себя по-разному, когда &
включено, а когда нет?
Существует по крайней мере одно отличие, заключающееся в том, что функции с квалификацией ref (типа l-value или r-value) не могут быть перегружены функциями без квалификации ref. От текущий стандартный проект:
Объявления функций-членов с одинаковыми именами и одинаковыми
список параметров типа, а также шаблон функции-члена
объявления с тем же именем, тем же параметром-тип-списком и
одни и те же списки параметров шаблона не могут быть перегружены, если они есть, но не
все, есть реф-классификатор.
…но если это единственная разница, почему ограничение? То есть почему не могу foo()&&
рассматриваться как действительное переопределение (неквалифицированное) foo()
?
Они разные.
Foo foo;
std::move(foo).func();
позвоню func()
но нет func()&
,
Так же:
Foo make_foo() { return {}; }
make_foo().func();
будет работать только на void func()
подпись, а не void func()&
подпись.
void func()&
означает, что это только допустимый вызов lvalues, а не rvalues.