Вопрос

Я видел там ответ:Является ли возврат по ссылке rvalue более эффективным?

Определение функции-члена:

Beta_ab const& getAB() const& { return ab; }

Я знаком с резюме-квалификатор (const) на функциях-членах, но не const&.

Что означает последний const& иметь в виду?

Это было полезно?

Решение

А & это ref-квалификатор.Ref-квалификаторы появились в C++11 и пока не поддерживаются всеми компиляторами, поэтому в настоящее время вы их не так часто встретите.Он указывает, что эту функцию можно вызывать только для lvalue (а не для rvalue):

#include <iostream>

class kitten
{
private:
    int mood = 0;

public:
    void pet() &
    {
        mood += 1;
    }
};

int main()
{
    kitten cat{};
    cat.pet(); // ok

    kitten{}.pet(); // not ok: cannot pet a temporary kitten
}

В сочетании с cv-квалификатором const, это означает, что вы можете вызывать эту функцию-член только для lvalue, и они могут быть константными.

Другие советы

Мы знаем, что в этом коде...

Beta_ab const& getAB() const { return ab; }
                       ^^^^^

Выделенный const означает, что функция-член может быть вызвана const объект.Функция-член всегда может быть вызвана для не-const объект независимо от cv-квалификации функции.

Итак, в этом коде...

Beta_ab const& getAB() const & { return ab; }
                             ^

Следует ожидать, что выделенное & также кое-что говорит о том, к каким типам объектов разрешено вызывать эту функцию-член.Мы были бы правы;в C++11 это говорит о том, что функцию-член можно вызывать только для lvalue.

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }

В приведенном выше примере первая перегрузка вызывается для lvalue, а вторая перегрузка — для не-const значения.Аналогично следующему, более знакомому примеру, с квалификаторами, применяемыми к обычным параметрам функции:

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top