Разница между геттерами, заканчивающимися на const и const &

Я смотрел выступление (точная временная метка, не объясненная им) Николая Йосуттиса (члена комитета по стандартизации C++), и он заявил, что получатели должны быть написаны так:

const std::string& getName() const&
{
     return memberStringVar;
} 

С тех пор C++ 11. Вопрос в том, какая разница по сравнению с этим геттером?

const std::string& getName() const
{
     return memberStringVar;
}

Ответы

Ответ 1

В примере, приведенном в getName(), есть две перегруженные функции getName(). Один с && а другой с const& квалификаторами.

Без & после const, функция const std::string& getName() const не может быть перегружена перегрузкой для значений r string Customer::getName() &&.

Затем вы должны полностью удалить перегрузку rvalue из кода, если хотите, чтобы он работал.

Так как квалифицированные функции-члены ref были добавлены только в С++ 11 (что делает возможным получение значений для r), переход от const std::string& getName() const к const std::string& getName() const& был необходим для обеих перегрузок. возможный.

Проект стандарта С++ 17 n4659 гласит:

16.1 Перегружаемые объявления [over.load]
...

2 Некоторые объявления функций не могут быть перегружены:
...
(2.3) - Объявления функций-членов с одинаковыми именами и одинаковым списком типов параметров, а также объявления шаблонов функций-членов с одинаковыми именами, одинаковым списком параметров-типов и одинаковыми списками параметров шаблона не могут быть перегружены, если таковые имеются из них, но не у всех, есть реф-классификатор.

Поскольку существует одна перегрузка getName() с квалификатором ref (&&), у другой также должен быть квалификатор ref. Вот почему const& требуется.