Вы можете иметь и то, и другое. Нет особых требований по включению обоих, если вы реализуете один.
Загвоздка в том, что метод-член (нестатический член), не отмеченный квалификатором, подходит для использования как с lvalue, так и с rvalue. После того как вы перегружаете метод квалификатором ref, если вы не отметите и другие, вы столкнетесь с проблемами неоднозначности.
Во время разрешения перегрузки нестатическая cv-квалифицированная функция-член класса X
обрабатывается как функция, которая принимает неявный параметр типа lvalue, ссылка на cv-qualified X
, если она не имеет квалификаторов ref или если она имеет квалификатор ref lvalue. . В противном случае (если у него есть ref-qualifier rvalue), он обрабатывается как функция, принимающая неявный параметр типа rvalue, ссылающийся на cv-квалифицированный X
.
Таким образом, в основном, если у вас есть один квалифицированный метод (например, для lvalue &
) и один неквалифицированный, правила таковы, что они эффективно оба квалифицированы и, следовательно, неоднозначны.
Аналогичное обоснование применяется к квалификатору const
. Вы можете реализовать метод и иметь одну «версию» для объекта const
и одну для объекта, отличного от const
. Контейнеры стандартной библиотеки являются хорошими примерами этого, в частности begin()
, end()
и другие методы, связанные с итераторами.
Один конкретный вариант использования — это когда логика, применяемая к методу, отличается между тем, когда объект является временным (или истекающим) объектом, и когда это не так. Вы можете оптимизировать внутреннюю обработку определенных вызовов и данных, если знаете, что время жизни подходит к концу.
Другой способ — ограничить использование метода значениями lvalue. Определенная часть логики приложения или объекта может не иметь смысла или быть бесполезной, если срок действия сущности скоро истечет или она является временной.
Формулировка в стандарте (взято из проекта N4567) из §13.4.1/4:
Для нестатических функций-членов тип неявного параметра объекта:
«ссылка lvalue на cv X» для функций, объявленных без квалификатора ref или с квалификатором & ref
«ссылка rvalue на cv X» для функций, объявленных с помощью квалификатора && ref
person
Niall
schedule
15.02.2016
void f() {...}
в зависимости от других перегрузок звучит запутанно. - person chris   schedule 14.02.2016&
/&&
использовался на практике. - person Lingxi   schedule 14.02.2016const char* str = getStr().c_str();
. Вы можете использовать это, чтобы превратить это в ошибку компилятора. К сожалению, в настоящее время нет способа сделать его надежным (т. е. быть ошибкой, но все еще работать вfoo(getStr().c_str());
). Я знаю, что это изучается в стандартных предложениях. Также см. этот вопрос для использования . - person chris   schedule 14.02.2016void f() &&
без каких-либо других определенийf
- person M.M   schedule 14.02.2016