Разница между геттерами, заканчивающимися на const и const & - PullRequest
0 голосов
/ 22 февраля 2019

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

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

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

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

1 Ответ

0 голосов
/ 22 февраля 2019

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

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

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

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

В проекте стандарта C ++ 17 n4659 говорится:

16.1 Объявления с перегрузкой [over.load]
...

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

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

...