Разница между l-значением ref-квалифицированной функцией-членом и неквалифицированной функцией-членом?

Есть ли разница между функциями-членами с l-значением ref и неквалифицированными функциями-членами? Если так, то, что это?

То есть, это два способа объявления func() разные?

class Foo
{
void func();
void func() &;
};

Я не имею в виду «достаточно ли они различны для разрешения перегрузки», потому что, очевидно, вышеприведенный класс не компилируется, когда обе версии func() присутствуют. Я имею в виду, как и почему компилятор ведет себя по-разному, когда & включено, а когда нет?

Существует по крайней мере одно отличие, заключающееся в том, что функции с квалификацией ref (типа l-value или r-value) не могут быть перегружены функциями без квалификации ref. От текущий стандартный проект:

Объявления функций-членов с одинаковыми именами и одинаковыми
список параметров типа, а также шаблон функции-члена
объявления с тем же именем, тем же параметром-тип-списком и
одни и те же списки параметров шаблона не могут быть перегружены, если они есть, но не
все, есть реф-классификатор.

…но если это единственная разница, почему ограничение? То есть почему не могу foo()&& рассматриваться как действительное переопределение (неквалифицированное) foo()?

1

Решение

Они разные.

Foo foo;
std::move(foo).func();

позвоню func() но нет func()&,

Так же:

Foo make_foo() { return {}; }
make_foo().func();

будет работать только на void func() подпись, а не void func()& подпись.

void func()& означает, что это только допустимый вызов lvalues, а не rvalues.

3

Другие решения


По вопросам рекламы [email protected]